題目描述
把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。 輸入一個非遞減排序的數(shù)組的一個旋轉(zhuǎn),輸出旋轉(zhuǎn)數(shù)組的最小元素。 例如數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉(zhuǎn),該數(shù)組的最小值為1。 NOTE:給出的所有元素都大于0,若數(shù)組大小為0,請返回0。
function minNumberInRotateArray(rotateArray)
{
// write code here
}
方法一
分析:尋找分界點,分界點前后都是非遞減數(shù)組,分界點后面的非遞減數(shù)組比分界點前面的數(shù)組都要小,因此對旋轉(zhuǎn)數(shù)組按順序查找,當(dāng)出現(xiàn)后一個數(shù)比前一個小時,這個數(shù)就是最小值,若沒有出現(xiàn)后一個數(shù)比前一個數(shù)小的情況,這說明這個數(shù)組所有的數(shù)都相等,返回數(shù)組第一個數(shù)即可??蠢@了就舉個例子跑一下吧
代碼:
function minNumberInRotateArray(rotateArray)
{
// write code here
if(rotateArray.length===0){
return 0;
}
let i;
for(i=0;i<rotateArray.length-1;i++){
if(rotateArray[i]>rotateArray[i+1]){
return rotateArray[i+1];
}
}
return rotateArray[0];
}
時間復(fù)雜度:o(n)
方法二
分析:折半查找就是為了縮小查找范圍.定義left,rightl兩個“哨兵”,由于是旋轉(zhuǎn)數(shù)組,所以left指向的元素>=right指向的元素(除過1,2,3,4,5這種旋轉(zhuǎn)特例則直接返回第一個元素)。while循環(huán)結(jié)束條件是最終left,right指向兩個相鄰的元素,而且right指向的是最小的元素
代碼:
let arr = [3,4,5,1,2];
function minNumberInRotateArray(array)
{
if (array.length == 0)
return 0;
let left = 0;
let right = array.length - 1;
let middle = left;
while (array[left]>=array[right]) {
if(right-left==1){
middle = right;
break;
}
middle = Math.ceil((left+right)/ 2);
if (array[middle] >= array[left]) {
left = middle;
}
if (array[middle] <= array[right]) {
right = middle;
}
}
return array[middle];
}
minNumberInRotateArray(arr);// 1
時間復(fù)雜度:o(log(n))
每天努力一點點
謝謝你看完