leetcode(17)-搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的解法

先找到数组的中间点,数组肯定会被分成两部分,一部分是已经排序好的数组,另一部分仍然是旋转数组,然后递归查找。

class Solution:
    def search(self, nums, target: int) -> int:
        def find(head ,tail):
            while head<=tail:
                mid = (head+tail)//2
                if nums[mid]<target:
                    head = mid+1
                elif nums[mid]>target:
                    tail = mid-1
                else:
                    return mid
            return None
        def find2(start,end):
            if end-start<=2:
                for i in range(start,end+1):
                    if nums[i] == target:
                        return i
                return None
            s0 = start
            s1 = (start+end)//2
            s2 = end
            if nums[s1]<=nums[s0]:
                res = find2(s0,s1-1)
                if res is not None:
                    return res
                if target< nums[s1] or target>nums[s2]:
                    pass
                else:
                    return find(s1,s2)     
                pass                
            elif nums[s1]>=nums[s2]:
                res = find2(s1+1,s2)
                if res is not None:
                    return res
                if target< nums[s0] or target>nums[s1]:
                    pass
                else:
                    return find(s0,s1)
            else:
                if target< nums[start] or target>nums[end]:
                    return None
                else:
                    return find(s0,s2)
        t = find2(0,len(nums)-1)
        return t if t is not None else -1
s= Solution()
print(s.search([4,5,6,7,0,1,2],4))

官方题解

先二分查找到最小值,恢复序列,(旋转点一定是最小值)然后再二分查找

猜你喜欢

转载自www.cnblogs.com/Lzqayx/p/12153281.html
今日推荐