力扣练习之搜索旋转排序数组

我爱海鲸 2023-04-05 23:40:34 力扣、中级算法

简介中级算法、排序和搜索、之前的话一直使用java来写的,现在开始用python来写相关的解法了

原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvyz1t/

解法一(python)

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        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 < nums[mid]:
                    right = mid - 1
                else: 
                    left = mid + 1
            else:
                if nums[mid] < target <= nums[right]:
                    left = mid + 1
                else:
                    right = mid - 1
        return -1

思路:我们可以首先判断中间元素 mid 和左端点元素 left 的大小关系,如果 mid 大于等于 left,则说明左半边是有序的,右半边是无序的;反之则说明右半边是有序的,左半边是无序的。然后根据 target 和有序的那一半端点元素的大小关系来确定查找范围。

你好:我的2025