旋转数组:数组最开始的若干元素搬到数组末尾。 输入:一个递增排序数组的旋转 输出:旋转数组的最小元素 示例:[3,4,5,1,2]为[1,2,3,4,5]的旋转,最小值为1
方法一 暴力解法
class Solution:
def minArray(self, numbers: List[int]) -> int:
min = numbers[0]
for i in numbers:
if i < min :
min = i
return min
时间复杂度:O(n)
空间复杂度:O(1)
先用这个方法做了,然后自己尝试用二分法做,发现不正确。所以看了题解之后自己写了一遍。
方法二 二分法
主要思路:比较mid和right位置的元素大小,
如果mid位置元素大,说明前半部分有序,查找区间改为后半部分;
如果mid位置元素小, 说明后半部分有序,查找区间改为前半部分;
如果相等,则暴力向前遍历,即减小right。
class Solution:
def minArray(self, numbers: List[int]) -> int:
left = 0
right = len(numbers) - 1
if right == 0: #数组只有一个元素
return numbers[0]
while left < right :
mid = (left + right) // 2
if numbers[mid ] > numbers[right]:
left = mid+1
elif numbers[mid] < numbers[right]:
right = mid
else:
right -= 1
return numbers[left]
时间复杂度:最好为O(logN),最差为元素都相等的情况,while循环需要执行N次,所以为O(N)。
空间复杂度:O(1)