标签:区间 相等 http numbers 怎么 误区 返回值 序列 object
关于旋转数组有各种变种问题:是否有重复元素、寻找最大值最小值、寻找旋转点下标(旋转点的值等于最小值)、查找给定元素。本题就是对有重复元素的旋转数组,寻找其最小值。
首先想到二分查找没问题,关键在于怎么通过判断middle元素的相对大小去逐渐缩小搜索区间。如下图所示(无重复元素)
循环二分,middle = (left + right) // 2(向下取整)为每次二分的中点,恒有left <= middle < right
返回值,当left = right时跳出循环,返回num[left]即可
特殊情形
寻找最小值时不可以让num[middle]和num[left]进行对比,因为对比的目的是判断middle处于哪边序列,当只有一个序列时会出现问题。寻找最大值时和num[left]比较,寻找最小值时和num[right]比较。
误区: 判断middle处于哪边序列中时,只需要和一边比较就可以,不需要同时比较left和right。从结果上看其实并不需要很复杂很多的判断条件,一开始判断条件过多容易混乱,需要从多种条件中抽离出关键点。
Python
class Solution(object):
def minArray(self, numbers):
"""
:type numbers: List[int]
:rtype: int
"""
left = 0
right = len(numbers) - 1
while left < right:
middle = (left + right) // 2
if numbers[middle] > numbers[right]:
left = middle + 1
elif numbers[middle] < numbers[right]:
right = middle
else:
right = right - 1
return numbers[left]
标签:区间 相等 http numbers 怎么 误区 返回值 序列 object
原文地址:https://www.cnblogs.com/cling-cling/p/12935855.html