要求
- 时间限制:3秒
- 空间限制:32768K
- 热度指数:461399
- 本题知识点: 查找
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路
思路一:顺序查找
若数组为空直接返回0;若数组不为空,则顺序遍历数组,直到遇到当前值比后一个值大的情况,此时直接返回后一个值,如果遍历完数组也没找到满足条件的情况,则直接返回数组的最后一个值。此算法的时间复杂度为 O ( n ) O(n) O(n)。
python实现
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
length = len(rotateArray)
if length == 0:
return 0
for i in range(length-1):
if rotateArray[i] > rotateArray[i+1]:
return rotateArray[i+1];
return rotateArray[length-1]
- 运行时间:678ms
- 占用内存:5852k
C++实现
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int length = rotateArray.size();
if(length==0)
return 0;
for(int i=0; i<length-1; i++){
if (rotateArray[i]>rotateArray[i+1])
return rotateArray[i+1];
}
return rotateArray[length-1];
}
};
- 运行时间:38ms
- 占用内存:504k
思路二:二分法查找
二分法查找的思路可以使时间复杂度降为 O ( l o g n ) O(logn) O(logn),但是当所有元素值都相等时,该方法时间复杂度会退化到 O ( n ) O(n) O(n)。具体执行方法如下:
- 初始化low,mid,high
- 比较a[mid]与a[high]:若前者大,则表明最小值一定在mid右边;若相等,则无法确定最小值在mid左边还是右边,这时候只能一个个试,high值减一;若前者小,则说明最小值一定为mid或者在mid的左边。
python实现
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
low = 0
high = len(rotateArray) - 1
while low < high:
mid = low + (high - low) / 2
if rotateArray[mid] > rotateArray[high]:
low = mid + 1
elif rotateArray[mid] == rotateArray[high]:
high = high - 1;
else:
high = mid;
return rotateArray[low];
- 运行时间:1078ms
- 占用内存:5732k
C++实现
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int low = 0;
int high = rotateArray.size() - 1;
int mid = 0;
while (low < high){
mid = low + (high-low)/2;
if (rotateArray[mid] > rotateArray[high])
low = mid + 1;
else if (rotateArray[mid] == rotateArray[high])
high = high - 1;
else if (rotateArray[mid] < rotateArray[high])
high = mid;
}
return rotateArray[low];
}
};
- 运行时间:31ms
- 占用内存:608k