原视频链接:数组峰值 搜索旋转排序数组【基础算法精讲 05】,博主:灵茶山艾府

下面都是用左闭右开区间来写的(因为我比较喜欢用左闭右开区间)

一、寻找峰值(162. 寻找峰值

class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        # 本题用左闭右开区间来写:[0, n-1)
        # 闭区间遍历:[0,n-2]
        # 时间复杂度O(log n)
        # 空间复杂度O(1)
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = (left + right) // 2
            if nums[mid] > nums[mid + 1]:
                right = mid
            else:
                left = mid + 1
        return left

二、寻找旋转排序数组中的最小值(153. 寻找旋转排序数组中的最小值

class Solution:
    def findMin(self, nums: List[int]) -> int:
        # 本题用左闭右开区间来写:[0, n-1)
        # 闭区间遍历:[0,n-2]
        # 时间复杂度O(log n)
        # 空间复杂度O(1)
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = (left + right) // 2
            if nums[mid] < nums[-1]: # 这部分不一样
                right = mid
            else:
                left = mid + 1
        return nums[right] # 这部分不一样

三、搜索旋转排序数组(33. 搜索旋转排序数组

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        def is_blue(i: int) -> bool:
            end = nums[-1]
            if nums[i] > end:
                return target > end and nums[i] >= target
            else:
                return target > end or nums[i] >= target
        
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = (left + right) // 2
            if is_blue(mid):
                right = mid
            else:
                left = mid + 1
        if right == len(nums) or nums[right] != target:
            return -1
        return right

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐