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

搜索旋转排序数组

  1. 题目
    假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [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

  2. 思路
    (1)找到旋转数组的最小值索引min_index
    (2)把原旋转数组以min_index为界限分成两个数组
    (3)分别对两个数组进行二分查找

  3. 代码

class Solution:
    def search(self, nums,target):
        # 数组元素个数为0和1的特殊情况
        if not nums:
            return -1
        if len(nums) == 1:
            if nums[0] == target:
                return 0
            else:
                return -1
        mid = -1
        # 先找出最小值索引
        l, r = 0, len(nums) - 1
        while l < r:
            mid = int((l + r) / 2)
            if nums[mid] > nums[mid + 1]:
                mid = mid + 1
                break
            if nums[mid] > nums[-1]:
                l = mid + 1
            elif nums[mid] <= nums[-1]:
                r = mid
        min_index = mid
        # 对第一个数组二分查找
        l1, r1 = 0, min_index
        while l1 < r1:
            mid1 = int((l1 + r1) / 2)
            if nums[mid1] == target:
                return mid1
            elif nums[mid1] < target:
                l1 = mid1 + 1
            else:
                r1 = mid1
        # 对第二个数组二分查找
        l2, r2 = min_index, len(nums)
        while l2 < r2:
            mid2 = int((l2 + r2) / 2)
            if nums[mid2] == target:
                return mid2
            elif nums[mid2] < target:
                l2 = mid2 + 1
            else:
                r2 = mid2
        return -1
  1. 运行结果
    leetcode 33. 搜索旋转排序数组(python)_第1张图片

你可能感兴趣的:(leetcode 33. 搜索旋转排序数组(python))