把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{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++這個代碼很強大的呀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM