``把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列[3,4,5,1,2]為[1,2,3,4,5]的乙個旋轉,該陣列的最小值為1。
note:給出的所有元素都大於0,若陣列大小為0,請返回0。
直接遍歷一遍陣列,即可找到最小值。但是本題的附加條件就沒有用上。肯定不是面試官所期望的答案。
**這種二分查詢難就難在,arr[mid]跟誰比.
我們的目的是:當進行一次比較時,一定能夠確定答案在mid的某一側。一次比較為 arr[mid]跟誰比的問題。
一般的比較原則有:
如果有目標值target,那麼直接讓arr[mid] 和 target 比較即可。
如果沒有目標值,一般可以考慮 端點
這裡我們把target 看作是右端點,來進行分析,那就要分析以下三種情況,看是否可以達到上述的目標。
情況1,arr[mid] > target:4 5 6 1 2 3
arr[mid] 為 6, target為右端點 3, arr[mid] > target, 說明[first … mid] 都是 >= target 的,因為原始陣列是非遞減,所以可以確定答案為 [mid+1…last]區間,所以 first = mid + 1
情況2,arr[mid] < target:5 6 1 2 3 4
arr[mid] 為 1, target為右端點 4, arr[mid] < target, 說明答案肯定不在[mid+1…last],但是arr[mid] 有可能是答案,所以答案在[first, mid]區間,所以last = mid;
情況3,arr[mid] == target:
如果是 1 0 1 1 1, arr[mid] = target = 1, 顯然答案在左邊
如果是 1 1 1 0 1, arr[mid] = target = 1, 顯然答案在右邊
所以這種情況,不能確定答案在左邊還是右邊,那麼就讓last = last - 1;慢慢縮少區間,同時也不會錯過答案。
原始陣列:
旋轉陣列:
題目的精華部分:
如果此時mid>last,則first的位置就要變成mid+1,需要進行縮小區間來,慢慢取值,取值範圍就變成了[1,2,3,4,5]
如果此時midint
minnumberinrotatearray
(int
* rotatearray,
int rotatearraylen )
int first =0;
int last = rotatearraylen-1;
if(rotatearraylen ==0)
return0;
while
(first < last)
int mid =
(first + last)/2
;if(rotatearray[mid]
> rotatearray[last]
)else
if(rotatearray[mid]
)else
last--;}
return rotatearray[first]
;}
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
c 刷題 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。遍歷陣列,找到第乙個比上乙個元素小的元素,返回該元素。class sol...