劍指Offer08 陣列旋轉問題

2021-09-26 15:05:04 字數 1258 閱讀 2521

把乙個陣列最開始的若干個元素搬到陣列末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出陣列最小的元素。例如陣列為的乙個旋轉,該陣列的最小值為1。

採用二分法的思路,設定兩個指標分別指向陣列的第乙個元素和最後乙個元素。(第乙個元素應該是大於或者等於最後乙個元素的,存在特例)找到陣列中間的元素(mid=(head+tail)/2),如果中間的元素位於前面的遞增子陣列,那麼它應該大於或者等於第乙個指標指向的元素。此時陣列中最小的元素應該位於該中間元素的後面。我們可以把第乙個指標指向該中間元素,這樣可以縮小尋找的範圍。移動之後的第乙個指標仍然位於前面的遞增陣列中。

如果中間元素位於後面的遞增子陣列,那麼它應該小於或者等於第二個指標指向的元素。此時該陣列中最小的元素應該位於該中間元素的前面。我們可以把第二個指標指向該中間元素,這樣也可以縮小尋找的範圍。移動之後的第二個指標仍然位於後面的遞增子陣列之中。

因此,第乙個指標總是指向前面遞增的數字元素,而第二個指標總是指向後面遞增的陣列的元素。最終第乙個指標將指向前面子陣列的最後乙個元素,而第二個指標將指向後面子陣列的第乙個元素。也就是他們最終會指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素。這就是迴圈結束的條件。

注意兩種特殊情況:

和陣列都可以看成是遞增陣列的旋轉。在這兩個陣列中,第乙個數字、最後乙個數字和中間數字都是1,我們無法確定中間數字1屬於第乙個遞增子陣列還是屬於第二個遞增子陣列。(實際上,第一種情況下,中間數字位於後面的子陣列;第二種情況中,中間數字位於前面的子陣列中)

public class code008 

//兩指標正中間的數字對應的下標

indexmid=(index1+index2)/2;

//如果下標為index1和index2和indexmid的三個數字相等,那麼只能順序查詢了

if(arr[index1]==arr[index2] && arr[indexmid]==arr[index1])

//如果左指標指向的數字小於中間的數字,那麼目標數字位於中間數與尾指標之間

if(arr[indexmid]>=arr[index1])

//如果尾指標指向數字大於中間數字,那麼目標數字位於左指標與中間數字之間

if(arr[indexmid]<=arr[index2])

}return arr[indexmid];

}private static int minindexorder(int arr, int index1, int index2)

}return result;

}}

劍指offer 08 跳台階

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 於本題,前提只有 一次 1階或者2階的跳法。a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 b.假定第一次跳的是2階,那麼剩下的是...

劍指offer 08 跳台階

題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法 先後次序不同算不同的結果 時間限制 c c 3秒,其他語言6秒 空間限制 c c 64m,其他語言128m 題目示例 示例1 輸入 1 返回值 1 示例2 輸入 4 返回值 5解法分析我記得這好像是一...

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

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1。題目解析 分析 1 當陣列為空或者為null時返回 1 定義兩個指標start...