这道牛客上面的题就是想要找一个数组中的最小值。由题意我们可以知道,这是一个旋转数组。所以我们就需要了解什么是旋转数组。其实就是将一个好的数组,进行了多次的循环右移的操作。所以我们从题意中得到。这个数组是一个非减序的数组。那么我们就会更加清楚这个数组是一个有序的数组。当然我们想要找一个数的时候。我们首先是想到的是进行半分查找。所以在这里我给大家提供一个Cplus中的代码的方法。这个是一个比较好的半分查找方法。
C++做题方法
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size()==0)return 0;
int low = 0;
int high = rotateArray.size()-1;
while(low<high){
int mid = (low+high)/2;
if(rotateArray[mid]>rotateArray[high])
low = mid +1;
else if(rotateArray[mid]==rotateArray[high]){
high = high - 1;
}
else
high = mid;
}
return rotateArray[low];
}
};
然后我再给大家提供一种用java中的蛮力法进行数组的遍历,得到的数组的方法。这道题的做法主要的还是思想。这道题主要是为了我们找到最小值。而我们通过找规律,可以大体的知道这个最小的数组的位置是在什么地方。下面不多说,直接上代码。
java蛮力做题方法
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int j=array.length;
if (j==0)return 0;
int res = array[0];
for (int i = 0; i < array.length - 1; i++){
if(array[i] > array[i+1]){
res = array[i+1];
break;
}
}
return res;
}
}
然后为了感谢广大网友,下面我再用java中的中分法进行做一下。
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int high=array.length;
if (high==0)return 0;
int res = array[0];
int low =0;
high=high-1;
int mid;
while(low < high){
mid=(low+high)/2;
if (array[mid]<=array[high]) high=high-1;
else low=mid+1;
}
return array[low];
}
}
在这里我想要说两句了,就是如果你要是实际的操作你就会知道。这里面C++代码的无论是耗时还是空间占用都是比java要小的,而且有的程序是小了很多。C++这个代码很强大的呀。