簡單法:
遍歷陣列,找到第乙個左邊的數大於右邊,就返回右邊的數,時間複雜度o(n)。
class solution
return numbers[0];}}
二分法:時間複雜度o(logn),最差的時候為o(n)
宣告 i, j 雙指標分別指向 numbers 陣列左右兩端;m為i,j中點,當i numbers[j]) //說明m在左排序陣列中,旋轉點在右邊
i = m + 1; //旋轉點一定會在右排序陣列中,所以i=m+1,免得多比較乙個數
else if(numbers[m] == numbers[j]) //無法判斷m在哪個陣列中
j = j - 1;
第三種情況可能會錯過旋轉點,但是還是能返回與旋轉點值相同的點
之前沒有深刻理解當nums[j] == nums[mid]時,為什麼j–一定是正確的。二刷時甚至忘記了當nums[j] == nums[mid]時,無法判斷旋轉點在哪一邊。比如:3,3,3,3,3,4,5,3,3這個陣列,第一次nums[mid] = 3,nums[j] = 3, 此時無法判斷旋轉點位置,j–,nums[mid] = 3,j會一直減到i的位置停下,返回nums[i],此時nums[i]雖然不是旋轉點,但是與旋轉點的值一定相同,因為左右都是遞增序列。
這裡總結一下:
1、左閉右閉區間,i = m + 1,j = m - 1,當i>j的時候停止.
2、左閉右開區間,i = m + 1, j = m,當i = j 的時候停止
劍指offer 11旋轉陣列中最小的數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。第一種方法 從頭開始遍歷,當遇到不滿足非遞減排序規律的那個數時,那就是旋...
劍指offer11 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。陣列可能包含重複項。注意 陣列內所含元素非負,若陣列大小為0,請返回 1。樣例 輸入 nums 2,2,2,0,1 輸出 0思路 首先判...
劍指Offer 11 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序陣列的乙個旋轉,輸出旋轉陣列的最小元素,例如,陣列為的乙個旋轉,該陣列的最小值為1.思路 設定兩個指標。利用二分查詢法。第乙個指標指向第乙個元素,第二個指向最後乙個元素。找到陣列的中間元素,如果中間的元素大於第乙...