內容:
把乙個陣列最開始的若干個元素搬到陣列末尾,我們稱之為陣列的旋轉。輸入乙個遞增序列的陣列的乙個旋轉,輸出旋轉陣列的最小元素。如:是的乙個旋轉陣列。最小值為1.
解題思路:
如果從頭到尾遍歷陣列,能找到這個元素,但是時間複雜度為o(n),對於旋轉陣列來說不可取。
我們注意到陣列旋轉之後實際上可以劃分兩個排序的子陣列,而且前面的陣列元素都大於或等於後面的陣列的元素,最小的元素剛好是這兩個子陣列的分界線。和二分法一樣分別用兩個指標指向陣列的第乙個元素和最後乙個,第乙個元素大於或等於最後乙個元素(除特例外),接著找到中間元素,如果中間元素位於前面的遞增陣列,此時最小值一定在後面的子陣列中,把第乙個指標移到中間值上,如果移動後的第乙個指標仍然位於前乙個子陣列,則繼續。如果中間數字於第二個子陣列,那麼中間數一定小於或者等於最後乙個元素,此時最小元素應該位於中間數前面,此時移動第二個指標到中間數,。依次重複上述步驟。
**實現:
int is_min(int *a,int length)
mid = ((right - left) >> 1) + left;
if (a[mid] > a[left])
left = mid;
else if (a[mid] < a[right])
right = mid;
} return a[mid];
}
特殊情況:如果陣列為:
,中間數為
1,無法確定中間數屬於前乙個子陣列遞增,還是後乙個子陣列遞增,所以就無法用指標來移動來縮小範圍查詢。所以需要用順序排序來確定:
**實現:
int min(int *a ,int left, int right)
return ret;
}int is_min(int *a,int length)
mid = ((right - left) >> 1) + left;
if ((a[left] == a[mid]) && (a[right] == a[mid])) //特殊情況,當中間值,第乙個元素,最後乙個元素都相等時
return min(a,left,right);
else if (a[mid] > a[left]) //中間值在前一部分
left = mid;
else if (a[mid] < a[right]) //中間值在後一部分
right = mid;
} return a[mid];
}
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
旋轉陣列中的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減序列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。查詢乙個陣列中最小值,直接遍歷當然是最簡單的方式,但是時間複雜度為o n 首先分析旋轉陣列的特點,假設旋轉陣列的前半部分為h,後半部分為t...