1 . 參考二分查找法,咱們用兩個指針分別指向數組的第一個元素和最後一個元素。數組
2 . 基於二分查找法的概念,找到數組中間的元素:由於該題目是查找旋轉數組中的最小值。spa
若是該中間元素位於前面的遞增子數組,那麼它應該大於或者等於第一個指針指向的元素。此時數組中最小的元素應該位於該中間元素的後面。咱們能夠把第一個指針指向該中間元素,這樣能夠縮小尋找的範圍。移動以後的第一個指針仍然位於前面的遞增子數組之中。指針
若是中間元素位於後面的遞增子數組,那麼它應該小於或者等於第二個指針指向的元素。此時該數組中最小的元素應該位於該中間元素的前面。code
3 . 接下來咱們再用更新以後的兩個指針,重複作新一輪的查找。blog
可參考下例:排序
1. 肯定Pmid爲5,Pmid>P1且Pmid>P2,說明P1到Pmid爲單增。it
2. 把Pmid定義爲P1,新的Pmid爲1,這時候Pmid<P1且Pmid<P2,說明Pmid到 P2是單增,把新的Pmid定義爲P2。io
3. 這時候P1>P2,且位置相差爲1,結束,得出最小數爲P2。class
1 . 魯棒判斷:即數組長度爲0或者爲空數組時,應返回0.方法
2 . 存在相等的數。
例:
1. 有重複數字,而且重複的數字恰好的最小的數字。 { 3, 4, 5, 1, 1, 2 }
2. 有重複數字,但重複的數字不是第一個數字和最後一個數字。 { 3, 4, 5, 1, 2, 2 }
3. 單調升序數組,旋轉0個元素,也就是單調升序數組自己。{ 1, 0, 1, 1, 1 }
4. 數組中只有一個數字。{ 1 }
適當的採用順序查找法。太晚了,明天寫吧!!
class Solution { public int minNumberInRotateArray(int[] rotateArray) { // write code here //魯棒判斷 if(rotateArray == null || rotateArray.Length <= 0) { return 0; } //定義三個參數,用於後期的指針 int a = 0; int b = rotateArray.Length - 1; int mid = 0; //while終止條件(每次前者大於後者的時候均要對比,當兩者差一個數據位時終止返回) while(rotateArray[a]>=rotateArray[b]) { if(b - a == 1) { mid = b; break; } //二分查找法,對mid參數的修改 mid = (b+a)/2; //特殊狀況,特殊對待(即數列中存在相等參數時,就採用順序查找法) if(rotateArray[a] == rotateArray[mid] && rotateArray[mid] == rotateArray[b]) { int min = rotateArray[a]; for(int i = 0;i<rotateArray.Length-1;i++) { if(min<rotateArray[i]) { min = rotateArray[i]; } } } //二分查找法,先後指針的修改 if(rotateArray[mid]>=rotateArray[a]) { a = mid; } if(rotateArray[mid]<=rotateArray[b]) { b = mid; } } //返回最小值 return rotateArray[mid]; } }