秋招程式設計題,旋轉陣列的最小數字C語言解法

2021-10-09 09:04:25 字數 1765 閱讀 8547

``把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列[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...