旋轉陣列的最小數字10

2021-07-11 23:18:30 字數 2227 閱讀 2605

題目描述:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如:陣列為的乙個旋轉,該陣列的最小值為1.

解題思路:題目的意思是在乙個部分有序的陣列中查詢最小數字。

1. 利用輸入的旋轉陣列特性,旋轉之後的陣列可分為兩個有序的子陣列。

2. 因為旋轉是把最開始的若干元素搬到陣列的末尾,因為輸入陣列是遞增的,所以前面子陣列的元素都 >= 後面子陣列元素。

3. 用兩個指標分別指向陣列的第一個元素和最後一個元素,按照旋轉規則,排除特例(特例是把排序陣列的前面的0個元素搬到後面),第乙個元素應該大於或者等於最後乙個元素。

4. 找到陣列中間的元素,中間元素是重點!

5. 如果中間元素位於前面的遞增陣列,那麼它應該大於或者等於第乙個指標指向的元素,此時陣列中最小的元素應該位於中間元素的後面。我們可以把第乙個指標指向該中間元素,縮小查詢範圍。

6. 如果中間元素位於後面的遞增陣列,那麼它應該小於或者等於第二個指標指向的元素,此時陣列中最小元素應該位於中間元素的前面。我們可以把第二個指標指向該中間元素,縮小查詢範圍。

7. 不管是移動第乙個指標還是第二個指標,查詢範圍都會縮小到原來的一半。

8. 再用更新之後的指標重新一輪查詢。

9. 當這兩個指標相鄰時,第二個指標指向的就是最小元素。即迴圈結束條件(point2 - point1 == 1)。

10. 返回中間下標值即為要查詢的數字。

特殊情況:當兩個指標指向的數字及它們的中間的數字三者相同的時候,我們無法判斷中間的數字是位於前面的子陣列還是後面的子陣列。如:的兩個旋轉->和。此時也就無法移動兩個指標來縮小範圍。判斷有這種情況,我們不得不用順序查詢

測試用例:

int main()的乙個旋轉

int arr[6] = ;

//int arr[5] = ; //傳入長度改為5, output: 0

//儲存最小數字

intmin;

//查詢其中的最小數字, 並返回結果

min = searchmin(arr, 6);

//輸出結果

std::cout << "minimum number is: "

<< min; //output: 1.

return

0;}

searchmin函式實現:

//考慮到有可能輸入旋轉陣列是這樣:或,此時兩個指標和中間數字的值都相同,只能採用

//順序查詢的方法

int mininorder(int *arr, int index1, int index2)

return result;

}//主體函式實現

int searchmin(int *arr, int length)

//確定中間值

indexmid = (index1 + index2) / 2;

//作一判斷,若三個下標相等,則只能採取順序查詢

if(arr[index1] == arr[index2] && arr[index1] == arr[indexmid])

return mininorder(arr, index1, index2);

if(arr[indexmid] >= arr[index1]) //如果中間值大於前面的值,則代表中間值在前子串行,必然不是最小元素,則

index1 = indexmid; //令重新賦值index1跳到中間值, 縮小查詢範圍。

else

if(arr[indexmid] <= arr[index2]) //如果中間值小於後面的值,則代表中間值在後子串行,有可能是最小元素,但

index2 = indexmid; //若不能達到退出迴圈的條件,必須繼續縮小範圍進行查詢

}return arr[indexmid];

}

旋轉陣列最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...

旋轉陣列最小數字

旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...

旋轉陣列的最小數字

1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...