LeetCode Search in Rotated Sorted Array

时间:2022-12-30 23:53:57

LeetCode解题之Search in Rotated Sorted Array


原题

把一个严格升序的数组进行旋转,如[0,1,2,3,4,5]旋转3位成为[3,4,5,0,1,2]。在这样的数组中找到目标数字。如果存在返回下标,不存在返回-1。

注意点:

  • 数组中不存在重复的数字
  • 不知道数组旋转了多少位

例子:

输入: nums = [4, 5, 6, 7, 0, 1, 2], target = 6
输出: 2

输入: nums = [4, 5, 6, 7, 0, 1, 2], target = 3
输出: -1

解题思路

采用了二分搜索,不过旋转后的数组要讨论的情况增多了。其实旋转后的数组的大小关系一般如下图:

     /
    /
   /
  /
             /
            /
           /

先通过中点与左顶点的关系来分类讨论中点落在了哪一部分,如果在左半边,则继续讨论目标数在中点的左边还是右边;如果在右半边,同样讨论目标数的位置。同时需要注意特殊情况只剩下两个数时,例如[3,1],这时求出的中点也是3,如果中点不匹配,应考虑1。这种情况不好与上面的情况合并,单独列出。

AC源码

class Solution(object):
    def search(self, nums, target):
        """ :type nums: List[int] :type target: int :rtype: int """
        left = 0
        right = len(nums) - 1
        while left <= right:
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return mid

            if nums[mid] > nums[left]:
                if nums[left] <= target <= nums[mid]:
                    right = mid - 1
                else:
                    left = mid + 1
            elif nums[mid] < nums[left]:
                if nums[mid] <= target <= nums[right]:
                    left = mid + 1
                else:
                    right = mid - 1
            else:
                left += 1
        return -1


if __name__ == "__main__":
    assert Solution().search([4, 5, 6, 7, 0, 1, 2], 4) == 0
    assert Solution().search([4, 5, 6, 7, 0, 1, 2], 7) == 3
    assert Solution().search([4, 5, 6, 7, 0, 1, 2], 0) == 4
    assert Solution().search([4, 5, 6, 7, 0, 1, 2], 2) == 6
    assert Solution().search([3, 1], 3) == 0
    assert Solution().search([3, 1], 1) == 1

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。