小編在求職找找工作期間劍指offer上的算法題刷了很多遍,並且每道題小編當時都總結了一種最適合面試時手撕算法的最優解法。考慮到劍指offer算法題在面試中的高頻出現,小編每天和大家分享一道劍指offer上的算法題,以及小編總結的答案。下面是第006道劍指offer算法題:
題目描述
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。例如,
輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如,數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。
NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。
解析:
見代碼註釋
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array[0]<array[array.length-1]) return array[0];//輸入數組沒有旋轉
int low = 0 ; int high = array.length - 1;
//最小的數字在旋轉之後的第二部分遞增序列中,所以只需要不斷逼近第二段遞增序列的第一個元素即可
while(low < high){
int mid =(high + low)>>1;
if(array[mid] < array[high]){//[mid,high]屬於第二段遞增序列。所以的往前尋找第二段遞增序列的開頭,移動high指針
high = mid;
}else if(array[mid] > array[high]){//mid在第一段遞增序列中,high在第二段遞增序列中,在mid之後尋找第二段遞增序列的開頭
low = mid+1;
}else{//相等無法判斷mid在那個遞增序列中
high--;
}
}
return array[low];
}
//兩個都可以過,這種解法有點奇怪,當數組有序的時候,應該是通不過d
public int minNumberInRotateArray2(int [] array) {
int low = 0 ; int high = array.length - 1;
//最小的數字在遞減部分,所以只需判斷哪一部分遞減即可
//另外第一部分不遞減,那麼第二部分就一定遞減,鎖以只需要判斷一半即可
while(low < high){
int mid =(high + low) >> 1;
if(array[mid] < array[low]){//如果前半段遞減的話,最小值在前半段
high = mid;
}else if(array[mid] == array[low]){
low = low + 1;
}else if(array[mid]>array[low]){//這裏不好判斷,因爲low可能是最小值
low = mid;//這裏表示後半段遞減,所以最小值在前半段
}
}
return array[low];
}
}
其他文章
1. 學習筆記和學習資料彙總:前端 + 後端 + java + 大數據 + python + 100多實戰項目 + C++
3. 零基礎學爬蟲
4. 零基礎C++學習總結
歡迎關注個人公衆號【菜鳥名企夢】,公衆號專注:互聯網求職面經、java、python、爬蟲、大數據等技術分享:
公衆號菜鳥名企夢後臺發送“csdn”即可免費領取【csdn】和【百度文庫】下載服務;
公衆號菜鳥名企夢後臺發送“資料”:即可領取5T精品學習資料、java面試考點和java面經總結,以及幾十個java、大數據項目,資料很全,你想找的幾乎都有