每日一練 旋轉陣列中的最小數字

2021-08-20 07:53:22 字數 1268 閱讀 9327

內容:

把乙個陣列最開始的若干個元素搬到陣列末尾,我們稱之為陣列的旋轉。輸入乙個遞增序列的陣列的乙個旋轉,輸出旋轉陣列的最小元素。如:是的乙個旋轉陣列。最小值為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...