33. 搜索旋转排序数组(medium)

2019-05-25  本文已影响0人  genggejianyi

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if not nums:
            return -1
        l,r = 0,len(nums)-1
        while l < r:
            m = (l+r)//2
            if nums[l] <= nums[m] and nums[l]<=target<=nums[m]:
                r = m
            elif nums[l] > nums[m] and target>=nums[l]>nums[m]:
                r = m
            elif nums[l] > nums[m] and target<=nums[m]<nums[l]:
                r = m
            else:
                l = m+1
        return l if nums[l]==target else -1

1.nums[0] <= nums[mid],(0-mid不包含旋转)且nums[0] <= target <= nums[mid]时high向前规约;
2.nums[mid] < nums[0](0-mid包含旋转),target <= nums[mid] < nums[0]时向前规约(target在旋转位置到mid之间)
3.nums[mid] < nums[0],nums[mid] < nums[0] <= target时向前规约(target在0到旋转位置之间)

上一篇 下一篇

猜你喜欢

热点阅读