力扣刷题Python笔记:搜索旋转排序数组

题目

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

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

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

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

你的算法时间复杂度必须是 O(log n) 级别。
力扣刷题Python笔记:搜索旋转排序数组_第1张图片
来源:力扣(LeetCode)

python解法

二分解法

题目中要求“你的算法时间复杂度必须是 O(log n) 级别”,一看到这一点,那八成是得用二分法了。但是题目中给出的数组是无序的,“按照升序排序的数组在预先未知的某个点上进行了旋转”,因此我们需要考虑怎么对这个数组用二分法。

既然数组是由升序排序的数组旋转得到的,因此我们将数组从中间分开,一定一半是有序的一半是无序的。而判断数组是否是有序的方法就是看数组的左端是否不大于右端,因此,我们首先找出有序数组,然后判断数组是否在有序数组的区间内,如果在则抛弃另一半数组,如果不在则抛弃有序数组,继续遍历,直到数组左端超过数组右端。

代码如下:

def search(self, nums: List[int], target: int) -> int:
    if not nums:
        return -1
    left = 0
    right = len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid

        if nums[left] <= nums[mid]: #说明左侧数组有序
            if nums[left] <= target and target <= nums[mid]:
                right = mid - 1
            else:
                left = mid + 1
        else: #说明右侧数组有序
            if nums[mid] <= target and target <= nums[right]:
                left = mid + 1
            else:
                right = mid - 1
    return -1

你可能感兴趣的:(力扣python刷题,算法)