求旋轉陣列的最小數字 二分查詢演算法的深入理解

2021-07-03 01:08:13 字數 1525 閱讀 7218

沒想到啊,沒想到,面試第一家網際網路企業的時候,就是這一問題。之前又看到過這個題型,但是沒有自己動手寫過**,所以花了一些時間才想出思路來,真是汗顏。在這裡重新做一下思路總結。

二分查詢演算法,針對乙個有序的陣列,可以有o(log2n)的時間複雜度。那對於相對有序的陣列,比如旋轉陣列,array1=,這種情況下如何查詢陣列當中的最小值?

思路:其實還是用二分查詢的思路,如果二分查詢的兩個指標兩頭就是指向乙個排序的陣列,那就好辦了。那兩個指標之間不是排序的呢?那就調整其中乙個指標使得他們兩個之間的陣列是排序的。就是說先判斷旋轉陣列頭和尾的數的大小,那邊大就調整哪邊的指標,比如,如果左邊的大,那麼將左邊的指標往右移,移多少呢,移一半(left+right)/2個單位。如果右邊大,那就移動右邊的指標一半的單位,知道兩個指標指向相鄰的兩個元素時,在比較左右兩個元素誰最小。返回下標值,結束。

點評:1二分查詢法;2分析能力;3還是要把情況想完整,想清楚。

// findminofrotatedarray.cpp : 定義控制台應用程式的入口點。

/* @mishidemudong

@2015-6-2-10:27

*///

#include "stdafx.h"

int min(int * numbers, int length)

mid = (first + end) / 2;

if (numbers[mid] >= numbers[first])

first = mid;

else if (numbers[mid] <= numbers[first])

end = mid;

} return mid;

}int _tmain(int argc, _tchar* argv)

; int array2 = ;

int array3 = ;

int array4 = ;

result1 = min(array1, 5);

result2 = min(array2, 5);

result3 = min(array3, 5);

result4 = min(array4, 5);

for (int i = 0; i < 5; ++i)

printf("%d ", array1[i]);

printf("\n%d\n ", result1);

for (int i = 0; i < 5; ++i)

printf("%d ", array2[i]);

printf("\n%d\n ", result2);

for (int i = 0; i < 5; ++i)

printf("%d ", array3[i]);

printf("\n%d\n", result3);

for (int i = 0; i < 5; ++i)

printf("%d ", array4[i]);

printf("\n%d\n", result4);

return 0;

}

陣列 二分查詢 旋轉陣列的最小數字

1.題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。2.class solution return rotatea...

旋轉陣列的最小數字 二分查詢思想

旋轉陣列的最小數字 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。分析 原始陣列為乙個非遞減排序,因此,我們...

求旋轉陣列的最小數字

package com.study 求旋轉陣列的最小數字 設定 輸入遞增排序陣列的乙個旋轉 要求返回最小的數 public class suanfa6 private static int arr private static int arr private static int arr priva...