把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
这道题的大概思路主要有以下几种:
1,最普通的方法,直接按照普通数组的处理,获取数组的最小值,很直接,很粗暴,当然算法很简单,如果面试的时候使用这种方法可能就……
2, 对思路1进行稍稍的改进,这个数组可以分为两个有序的数组,并且第一数组的最小值大于或等于第二个数组的最大值,而我们要获取的整个数组的最小值恰好是第二个数组的第一个数字;
3, 既然是有序的数组,那那么自然想到使用二分法查找,这是第三种思路
思路1代码,略
思路2代码:
class Solution {
public:
int minNumberInRotateArray(vector<int> r) {
int n = r.size();
if(n == 0) return 0;
for(int i = 0; i < n; i++) {
if(r[i] > r[i+1]) return r[i+1];
}
return r[0];
}
};
思路3代码:
class Solution {
public:
int minNumberInRotateArray(vector<int> r) {
int n = r.size();
if(n == 0) return 0;
int low = 0;
int high = n - 1;
while(low < high){
int mid = low + (high - low) / 2;
if(r[mid] > r[high]) {
low = mid + 1;
} else if(r[mid] == r[high]) {
high = high - 1;
} else if(r[mid] < r[high]){
high = mid;
}
}
return r[low];
}
};
因篇幅问题不能全部显示,请点此查看更多更全内容