标签:二分法
思路:
- 旋转数组的定义:是由一个本来有序的数组,经过首位元素的旋转交换后得到的数组。
- 则新的数组是分段的保持有序,如从AB变成BA(即数组一定程度上还是有序的)
- 确定新数组的中点、初始起点、初始终点的数组下标
media = len(rotateArray) // 2
start = 0
end = len(rotateArray) - 1
- 移动规律:
- 如果中点大于右端点,则最小值在右区间。此时需要缩小左界,start=media
- 如果中点大于左端点,则最小值在左区间。此时需要缩小右界,end=media
- 如果中点和左端点或右端点都相等,则要进行完整的一轮遍历。依次判断首尾值来缩小start和end值
class Solution:
def minNumberInRotateArray(self , rotateArray: List[int]) -> int:
media = len(rotateArray) // 2
start = 0
end = len(rotateArray) - 1
if rotateArray[media] > rotateArray[end]:
start = media + 1
elif rotateArray[media] < rotateArray[end]:
end = media
while start != end:
if rotateArray[end] >= rotateArray[start]:
end -= 1
else:
start += 1
return rotateArray[start]
参照帖子后做的优化: https://blog.nowcoder.net/n/fe92cdbd3338488b80167913b0be10b7
class Solution:
def minNumberInRotateArray(self , rotateArray: List[int]) -> int:
start = 0
end = len(rotateArray) - 1
while start < end:
media = (start + end) // 2
if rotateArray[media] > rotateArray[end]:
start = media + 1
elif rotateArray[media] == rotateArray[end]:
end -= 1
else:
end = media
return rotateArray[start]