直接遍歷一遍陣列,找出最小值,時間複雜度為o(n),但是這不是面試官想要的答案;
看到排序好的陣列,可以想到用二分查詢!二分查詢的時間複雜度是o(logn)。
前半部分陣列總是大於後半部分陣列,而最小值就是它們的臨界點!
public
class
test08 的乙個旋轉,該陣列的最小值為
**@param numbers 旋轉陣列
*@return 陣列的最小值
*/public
static
intmin(int numbers)
// 開始處理的第乙個位置
int lo = 0;
// 開始處理的最後乙個位置
int hi = numbers.length - 1;
// 設定初始值
int mi = lo;
// 確保lo在前乙個排好序的部分,hi在排好序的後乙個部分
while (numbers[lo] >= numbers[hi])
// 取中間的位置
mi = lo + (hi - lo) / 2;
// 如果三個數都相等,則需要進行順序處理,從頭到尾找最小的值
if (numbers[mi] == numbers[lo] && numbers[hi] == numbers[mi])
// 如果中間位置對應的值在前乙個排好序的部分,將lo設定為新的處理位置
if (numbers[mi] >= numbers[lo])
// 如果中間位置對應的值在後乙個排好序的部分,將hi設定為新的處理位置
else
if (numbers[mi] <= numbers[hi])
}// 返回最終的處理結果
return numbers[mi];
}/**
* 找陣列中的最小值
**@param numbers 陣列
*@param start 陣列的起始位置
*@param end 陣列的結束位置
*@return 找到的最小的數
*/public
static
intmininorder(int numbers, int start, int end)
}return result;
}public
static
void
main(string args) ;
system.out.println(min(array1));
// 有重複數字,並且重複的數字剛好的最小的數字
int array2 = ;
system.out.println(min(array2));
// 有重複數字,但重複的數字不是第乙個數字和最後乙個數字
int array3 = ;
system.out.println(min(array3));
// 有重複的數字,並且重複的數字剛好是第乙個數字和最後乙個數字
int array4 = ;
system.out.println(min(array4));
// 單調公升序陣列,旋轉0個元素,也就是單調公升序陣列本身
int array5 = ;
system.out.println(min(array5));
// 陣列中只有乙個數字
int array6 = ;
system.out.println(min(array6));
// 陣列中數字都相同
int array7 = ;
system.out.println(min(array7));
system.out.println(min(array6));
// 輸入null
system.out.println(min(null));
}}
面試題11 旋轉陣列的最小值
題目 把乙個有序陣列的末尾幾位移到最開始的位置形成的新的新陣列成為旋轉陣列,找出陣列的最小值。自己思路 查詢的話離不開遍歷,二分,雜湊,二叉搜尋樹。這題用遍歷可以解決,但是太耗費時間了。旋轉陣列的特點 前面的有序序列必然大於後面的有序序列 假設陣列之前是公升序排列 可以根據二分進行查詢。二分查詢的遞...
劍指offer 面試題8 旋轉陣列的最小值
package chapter2 面試題8 旋轉陣列的最小值 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。public class 08 rotatearray int arr...
劍指offer 面試題8 輸出旋轉陣列最小值
include using namespace std int min int arr,int len return arr q int main int m min arr,6 cout 這種 只能處理常規情況,如果陣列旋轉值為0,即陣列還是乙個遞增陣列,p q mid,陷入死迴圈。如果中間值跟兩...