剑指 Offer 11. 旋转数组的最小数字

171 阅读1分钟

题目链接

思路示意图

  1. 初始状态,以最小值为分界,左序列一定大于右序列 dhnHLd.md.png
  2. pivot在右序列,右序列递增,忽略掉pivot~high之间的元素即可 dhuBTI.md.png
  3. pivot在左序列,左序列一定比右序列大,因此要在pivot右边开始寻找 dhuqcF.md.png 4.pivot与high对应元素相等,可以有两种代码实现 dhuot0.md.png

代码实现

方法1

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        start = 0
        end = len(numbers)-1
        while start < end:
            mid = (start + end) // 2
            if numbers[end] > numbers[mid]: end = mid
            elif numbers[end] < numbers[mid]: start = mid + 1
            else: end -= 1
        return numbers[start]

方法2

当重复元素,由二分改为遍历

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        start = 0
        end = len(numbers)-1
        while start < end:
            mid = (start + end) // 2
            if numbers[end] > numbers[mid]: end = mid
            elif numbers[end] < numbers[mid]: start = mid + 1
            else: return findMin(numbers, start, end)
        return numbers[start]
        
    def findMin(numbers, start, end):
            result = numbers[start];
            for i in range(start, end+1):
                if (numbers[i] < result) result = numbers[i]
            return result