劍指Offer 旋轉陣列的最小數字

2022-01-28 23:18:43 字數 1826 閱讀 3227

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為1。

note:給出的所有元素都大於0,若陣列大小為0,請返回0

記錄當前元素cur的前乙個元素pre,當cur < pre的時候,cur就是最小的元素,時間複雜度為\(o(n)\)

int minnumberinrotatearray(vectorrotatearray) 

pre = rotatearray[i];

}}

借鑑二分查詢的思想,陣列旋轉後被分為兩部分

low 指向 左部分, high指向右部分

左右部分的分界點就是最小值

通過不斷地縮小[low, high]的範圍,最終low指向左部分最後乙個元素,high指向右部分第乙個元素,也就是最小值

這樣做能在牛客ac但其實是錯的,無法通過的檢驗

int minnumberinrotatearray(vectorrotatearray) 

while (low < high-1) else if (rotatearray[mid] < rotatearray[high]) else

}return rotatearray[high];

}

這道題的坑很多,牛客網上的測試用例不夠完善,這裡自己增加了一些特殊的測試用例,參考(chao xi)了大佬的**才通過了所有的測試用例

// 普通

// 旋轉0

這種做法的low並不會固定在陣列的左部分,由於rotatearray[mid] > rotatearray[low]時的處理是low = mid + 1,low有可能會到陣列的右部分第乙個元素,這時對陣列[low, high]部分的有序判斷將返回陣列的min

#include #include using namespace std;

int minnumberinrotatearray(vectorrotatearray)

mid = (low + high) / 2;

if (rotatearray[mid] > rotatearray[low])

} else if (rotatearray[mid] < rotatearray[high]) else

}return rotatearray[low];

}int main()

; int a2 = ;

int a3 = ; // 普通

int a4 = ; // 旋轉0

vectorinput1(a1, a1+5);

vectorinput2(a2, a2+5);

vectorinput3(a3, a3+5);

vectorinput4(a4, a4+5);

cout << minnumberinrotatearray(input1) << " expected: 1" << endl;

cout << minnumberinrotatearray(input2) << " expected: 0" << endl;

cout << minnumberinrotatearray(input3) << " expected: 1" << endl;

cout << minnumberinrotatearray(input4) << " expected: 1" << endl;

}

旋轉陣列的最小數字__牛客網

劍指offer 旋轉陣列的最小數

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...

劍指offer 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...

劍指offer 旋轉陣列的最小數字

記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...