沒想到啊,沒想到,面試第一家網際網路企業的時候,就是這一問題。之前又看到過這個題型,但是沒有自己動手寫過**,所以花了一些時間才想出思路來,真是汗顏。在這裡重新做一下思路總結。
二分查詢演算法,針對乙個有序的陣列,可以有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...