題目描述
把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾玻熙,我們稱之為數(shù)組的旋轉。 輸入一個非遞減排序的數(shù)組的一個旋轉疯攒,輸出旋轉數(shù)組的最小元素嗦随。 例如數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數(shù)組的最小值為1敬尺。 NOTE:給出的所有元素都大于0枚尼,若數(shù)組大小為0,請返回0砂吞。
function minNumberInRotateArray(rotateArray)
{
// write code here
}
方法一
分析:尋找分界點署恍,分界點前后都是非遞減數(shù)組,分界點后面的非遞減數(shù)組比分界點前面的數(shù)組都要小蜻直,因此對旋轉數(shù)組按順序查找盯质,當出現(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];
}
時間復雜度:o(n)
方法二
分析:折半查找就是為了縮小查找范圍.定義left,rightl兩個“哨兵”,由于是旋轉數(shù)組餐曼,所以left指向的元素>=right指向的元素(除過1,2,3,4,5這種旋轉特例則直接返回第一個元素)压储。while循環(huán)結束條件是最終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
時間復雜度:o(log(n))
每天努力一點點
謝謝你看完