把一個(gè)有序數(shù)組進(jìn)行旋轉(zhuǎn),對(duì)于已知旋轉(zhuǎn)后的數(shù)組,找出這個(gè)數(shù)組中的最小值。
云巖網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
這個(gè)問題看起來比較簡(jiǎn)單,只要遍歷一遍數(shù)組就能找到最小值,但如果題目中對(duì)時(shí)間復(fù)雜度有要求,那么這個(gè)時(shí)候就要考慮用其他的方法。
可以想到一種方法,二分查找法,每一次二分查找一定會(huì)有一邊的數(shù)字是連續(xù)且是遞增的,這個(gè)時(shí)候我們要找的最小值一定在另一邊,我們又把查找的范圍放在另一邊,以此下去,最終找到最小值,代碼如下:
int find(int a[], int size)
{
int left = 0;
int right = size - 1;
while (left <= right)
{
int mid = (left &right) + (left^right) / 2;
if (a[mid] <= a[left] && a[mid] <= a[right])
{
return a[mid];
}
else if (a[mid] < a[left])
{
right = mid - 1;
}
else if (a[mid] > a[right])
{
left = mid + 1;
}
}
return -1;
}
int main()
{
int a[] = { 3, 4, 5, 1, 2 };
int ret = find(a, 5);
printf("%d", ret);
system("pause");
return 0;
}