4. 二分查找

二分查找

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

旋转方式,最后一个元素旋转到开始的位置。
[5, 4, 3, 2, 1] nums[mid] > nums[right] 最小值在右侧
[3, 4, 5, 1, 2] nums[mid] > nums[right] 最小值在右侧
[1, 2, 3, 4, 5] nums[mid] < nums[right] 最小值在左侧
[3, 1, 2] # nums[mid] < nums[right] 最小值在左侧(包括mid的位置)

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left = 0
        n = len(nums) -1
        right = n
        while left < right:
            mid = (right-left)//2 + left
            if nums[mid] <= nums[right]:
                right = mid
            else:
                left = mid+1
        return nums[right]

540. 有序数组的 Single Element

题目描述:一个有序数组只有一个数不出现两次,找出这个数。
要求以 O(logN) 时间复杂度进行求解,因此不能遍历数组并进行异或操作来求解,这么做的时间复杂度为 O(N)。

令 index 为 Single Element 在数组中的位置。在 index 之后,数组中原来存在的成对状态被改变。如果 m 为偶数,并且 m + 1 < index,那么 nums[m] == nums[m + 1];m + 1 >= index,那么 nums[m] != nums[m + 1]。

从上面的规律可以知道,如果 nums[m] == nums[m + 1],那么 index 所在的数组位置为 [m + 2, h],此时令 l = m + 2;如果 nums[m] != nums[m + 1],那么 index 所在的数组位置为 [l, m],此时令 h = m。

因为 h 的赋值表达式为 h = m,那么循环条件也就只能使用 l < h 这种形式。

posted @ 2021-12-19 22:38  _无支祁  阅读(14)  评论(0编辑  收藏  举报