日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C/C++面试题—旋转数组的最小数字

發(fā)布時(shí)間:2025/3/15 c/c++ 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++面试题—旋转数组的最小数字 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

把一個(gè)數(shù)組最開(kāi)始的若干個(gè)元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。輸入一個(gè)非遞減排序的數(shù)組的一個(gè)旋轉(zhuǎn),輸出旋轉(zhuǎn)數(shù)組的最小元素。 例如數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個(gè)旋轉(zhuǎn),該數(shù)組的最小值為1。 NOTE:給出的所有元素都大于0,若數(shù)組大小為0,請(qǐng)返回0。

解題思路

{3,4,5,1,2}為{1,2,3,4,5}的旋轉(zhuǎn),前半部分始終大于等于后半部分,符合部分有序。仍然可以使用二分查找法,可判斷中間位置在前半部分還是在后半部分,如果在前半部分則min 在后半部分,否則在前半部分。這樣進(jìn)行二分查找。
但是有特殊情況,當(dāng)為這種情況時(shí){1,1,1,0,1}或者{1,0,1,1,1}使用二分查找不會(huì)得到正確的結(jié)果,這種情況只能使用順序查找了。

解題代碼

#include <vector> #include <iostream> using namespace std; /* 題目描述 把一個(gè)數(shù)組最開(kāi)始的若干個(gè)元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。 輸入一個(gè)非遞減排序的數(shù)組的一個(gè)旋轉(zhuǎn),輸出旋轉(zhuǎn)數(shù)組的最小元素。 例如數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個(gè)旋轉(zhuǎn),該數(shù)組的最小值為1。 NOTE:給出的所有元素都大于0,若數(shù)組大小為0,請(qǐng)返回0。 */ class SolutionMinNum { public:int minNumberInRotateArray(vector<int> rotateArray) {if (rotateArray.size() == 0)return 0;int low = 0;int high = rotateArray.size()-1;int mid = low;while (rotateArray[low] >= rotateArray[high]){if (high - low == 1){mid = high;break;}int mid = (low + high)/2;//特殊情況,{1,1,1,0,1}(只使用二分查找碰見(jiàn)可以查找成功,會(huì)走第一個(gè)if) 或者 {1,0,1,1,1}(只使用二分查找失敗)需要使用順序查找if (rotateArray[low] == rotateArray[mid] &&rotateArray[mid] == rotateArray[high]) return minInOrder(rotateArray, low, high);if (rotateArray[mid] >= rotateArray[low]) //最小值在后邊low = mid;else if (rotateArray[mid] <= rotateArray[high]) //最小值在前邊high = mid;}return rotateArray[mid];}int minInOrder(vector<int> & rotateArray, int low, int high) //順序查找最小值{int min = rotateArray[low];for (int i = low +1; i <=high; i++){if (min > rotateArray[i])min = rotateArray[i];}return min;} };int main(int argc, char *argv[]) {SolutionMinNum MinNum;vector<int> arr1 = { 3,4,5,1,2 };vector<int> arr2 = { 1, 1, 1, 0, 1 };vector<int> arr3 = { 1, 0, 1, 1, 1 };int min = MinNum.minNumberInRotateArray(arr1);cout << min << endl;min = MinNum.minNumberInRotateArray(arr2);cout << min << endl;min = MinNum.minNumberInRotateArray(arr3);cout << min << endl;system("pause");return EXIT_SUCCESS; }

運(yùn)行測(cè)試

總結(jié)

以上是生活随笔為你收集整理的C/C++面试题—旋转数组的最小数字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。