LeetCode Search in Rotated Sorted Array

来源:互联网 发布:淘宝卖家好评回复模板 编辑:程序博客网 时间:2024/06/08 10:15

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 -1if __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) 来获得相关源码。

0 0
原创粉丝点击