时间限制:3秒 空间限制:32768K 热度指数:739858
本题知识点: 查找
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题目链接:题目链接
看错题,我人都撒了,以为是让求最小旋转次数,想半天再仔细看一下题,发现是求数组的最小值。额,啥也不说无脑暴力。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int len = rotateArray.size();
if (len == 0){
return 0;
}
int minx = 0xffff;
for (int i=0;i<len;i++){
if (minx > rotateArray[i])//更新最小值
minx = rotateArray[i];
}
return minx;
}
};
嗯,评论区大佬有说用二分查找做的,想了一下,这里数组只满足局部有序,似乎不能用。。。结果,真的有用二分过的,膜,是在下思维短浅了。
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int len = rotateArray.size();
if (len == 0){
return 0;
}
int l = 0,r = len - 1;
while(l < r){
if (rotateArray[l] < rotateArray[r])//局部数组元素有序
return rotateArray[l];
int mid = (l + r) >> 1;
if (rotateArray[l] >= rotateArray[mid] && rotateArray[l] >= rotateArray[mid]){//顺序查找,不清楚递减序列在mid哪边
for (int i=l;i<r;i++){
if (rotateArray[i]> rotateArray[i+1])
return rotateArray[i+1];
}
}
if (rotateArray[l] <= rotateArray[mid]){//最小值在[mid+1,r]
l = mid + 1;
}
else if (rotateArray[mid] <= rotateArray[r]){//最小值在[l,mid]
r = mid;
}
}
return -1;
}
};