把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

 这道牛客上面的题就是想要找一个数组中的最小值。由题意我们可以知道,这是一个旋转数组。所以我们就需要了解什么是旋转数组。其实就是将一个好的数组,进行了多次的循环右移的操作。所以我们从题意中得到。这个数组是一个非减序的数组。那么我们就会更加清楚这个数组是一个有序的数组。当然我们想要找一个数的时候。我们首先是想到的是进行半分查找。所以在这里我给大家提供一个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++这个代码很强大的呀。

猜你喜欢

转载自www.cnblogs.com/littleswan/p/11311892.html