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

2021-10-05 10:14:27 字數 1965 閱讀 4244

本系列部落格為本人的刷題筆記,日後複習可以檢視。

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

刷題平台:牛客網

劍指offer中的分析,我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的字陣列,而且前面的字陣列的元素大於或者等於後面字陣列的元素。我們還注意到最小的元素剛好是這兩個字陣列的分界線。在排序的陣列中可以用二分查詢實現o(logn)的查詢。本題給出的陣列在一定程度上是排序的,因此我們可以試著用二分查詢法的思路來尋找這個最小的元素。

示意圖如下:

特殊情況:

牛客網不好除錯,在本地寫好的**,參考了牛客網的解析,具體**如下。

#include

#include

#include

#include

using

namespace std;

class

solution

//if

int p1 =

0,p2 = length -1;

int mid =0;

// rotatearray[p1] >= rotatearray[p2] 確保旋轉

while

(rotatearray[p1]

>= rotatearray[p2]

)//if

mid = p1 +

(p2 - p1)/2

;// rotatearray[p1] rotatearray[p2] rotatearray[mid]三者相等

// 無法確定中間元素是屬於前面還是後面的遞增子陣列

// 只能順序查詢

if(rotatearray[p1]

== rotatearray[p2]

&& rotatearray[p1]

== rotatearray[mid]

)//if

// 中間元素位於前面的遞增子陣列

// 此時最小元素位於中間元素的後面

if(rotatearray[mid]

>= rotatearray[p1]

)//if

// 中間元素位於後面的遞增子陣列

// 此時最小元素位於中間元素的前面

else

if(rotatearray[mid]

<= rotatearray[p2]

)//else

}//while

return rotatearray[mid];}

private

:// 順序尋找最小值

intminorder

(vector<

int>

&num,

int left,

int right)

//if

}//for

return result;}}

;int

main()

; vector<

int> num2 =

; vector<

int> num3 =

;int res1 = s.

minnumberinrotatearray

(num1)

;int res2 = s.

minnumberinrotatearray

(num2)

;int res3 = s.

minnumberinrotatearray

(num3)

; cout<

"\n"

<

"\n"

<

return0;

}

劍指offer 旋轉陣列的最小數

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

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

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

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

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