《劍指offer》第六題(js)

2021-10-04 06:58:25 字數 1137 閱讀 7579

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

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

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

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

思路: 首先,要明白非遞減陣列的意思,是增+平,比如:1,2,3,3,4 (開始我真的沒懂orz)

有序的陣列排序:二分法。設頭尾分別為 i , j 。 記搬到末尾的陣列段為右排序陣列,其餘的為左排序陣列。則左排序陣列大於等於右排序陣列。那麼:

當 i = j 時跳出二分迴圈,並返回 numbers[i] 即可。

q1: 為什麼不跟 i 比較?

跟 i 比較時,若 mid 比 i 位置的值大,我們認為 mid 在左排序陣列;比 i 位置的值小時,我們認為它在右排序陣列。但如果是這種極端的情況:[1,2,3,4,5](即所有陣列都搬到末尾,相當於沒有動) 它應該是在右排序陣列才對。

無論如何旋轉,j 初始值肯定是在右排序陣列,而 i 初始值是不確定在哪一段的。【像上述全部移動了的情況,就沒有左排序陣列了,也就是說,最左邊的值可能是移動了的陣列(右排序陣列),也可能是未移動的(左排序陣列)】

q2: 為什麼中間值等於 j 時執行 j = j - 1

首先, 無法判定 m 在左(右)排序陣列:

其次, j = j - 1 操作的正確性證明: 只需證明每次執行此操作後,旋轉點 x 仍在 [i, j] 區間內即可。

若 m 在右排序陣列中: 也就是說[m,j]這段都是重複相同的值,那麼 j = j - 1操作也就是減去了乙個重複的值,最小值還是會在這個區間裡面。

若 m 在左排序陣列中: 由於 左排序陣列 任一元素 >= 右排序陣列 任一元素 ,因此可推出旋轉點元素值 numbers[x] <= numbers[j] == numbers[m],則有:

while(line=readline())

function minnumberinrotatearray(rotatearray)

else if(rotatearray[mid] > rotatearray[j])

else j -= 1;

}return rotatearray[i];

}

學習自力扣(作者jyd)

劍指offer 第六題 輸出旋轉陣列的最小數字

解題思路 採用二分查詢法。需要考慮三種情況 array mid array r 出現這種情況的array類似 3,4,5,6,0,1,2 此時最小數字一定在mid的右邊。l mid 1 array mid array r 出現這種情況的array類似 1,0,1,1,1 或者 1,1,1,0,1 此...

100題 第六題

舉乙個例子,數值 0,1,2,3,4,5,6,7,8,9 分配 6,2,1,0,0,0,1,0,0,0 0在下排出現了6次,1在下排出現了2次,2在下排出現了1次,3在下排出現了0次.以此類推.一,暴力破解法 includeusing namespace std const int len 10 i...

劍指offer題六

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