把一個(gè)數(shù)組最開(kāi)始的若干個(gè)元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。輸入一個(gè)遞增排序的數(shù)組的一個(gè)旋轉(zhuǎn),輸出旋轉(zhuǎn)數(shù)組的最小元素。例如數(shù)組{3,4,5,1,2}為數(shù)組{1, 2,3, 4, 5}的一個(gè)旋轉(zhuǎn),該數(shù)組的最小值為1。
創(chuàng)新互聯(lián)是專業(yè)的劍川網(wǎng)站建設(shè)公司,劍川接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行劍川網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!當(dāng)然了,將數(shù)組遍歷一遍肯定能找出最小值,但其時(shí)間復(fù)雜度為O(N),效率是最低的,因此,應(yīng)該有一種更高效的解決辦法。
因?yàn)樵瓟?shù)組是遞增的,因此數(shù)組的第一個(gè)元素一定是最小值,而旋轉(zhuǎn)之后,其最小值就會(huì)成為旋轉(zhuǎn)的分界點(diǎn),因此,查找一個(gè)旋轉(zhuǎn)之后數(shù)組的最小值可以變成查找一個(gè)旋轉(zhuǎn)數(shù)組的旋轉(zhuǎn)點(diǎn)。而我們?nèi)匀豢梢园l(fā)現(xiàn),在旋轉(zhuǎn)點(diǎn)之前的序列是遞增有序的,而在旋轉(zhuǎn)點(diǎn)之后的序列也是遞增有序的,因此可以這樣判斷:
取數(shù)組的中間值;
如果中間值比最左值大且比最右值小,那么這個(gè)數(shù)組就是遞增數(shù)組旋轉(zhuǎn)幅度為0,最小值就為數(shù)組第一個(gè)值,直接返回;
如果中間值比左邊一個(gè)數(shù)小且比右邊一個(gè)數(shù)小,那么中間值就為旋轉(zhuǎn)點(diǎn)也就是最小值,直接返回;
如果中間值比最左值大且比最右值大,那么中間值往左一定是遞增有序的,而旋轉(zhuǎn)點(diǎn)一定在中間值往右,將范圍縮到中間值右半邊重新從第1步開(kāi)始;
如果中間值比最左值小且比最右值小,那么中間值往右一定是遞增有序的,而旋轉(zhuǎn)點(diǎn)一定在中間值往左,將范圍縮到中間值左半邊重新從第1步開(kāi)始;
上面的分析其實(shí)是相當(dāng)于在用二分查找來(lái)做,這樣就將時(shí)間復(fù)雜度降為了O(lgN),下面用代碼來(lái)實(shí)現(xiàn):
#include <iostream> #include <assert.h> using namespace std; int find_min_num(const int *arr, size_t n) { assert(arr && n); int left = 0; int right = n-1; int mid = (right-left)/2; while(left < right) { if((arr[left] <= arr[mid]) && (arr[mid] <= arr[right])) { break;//當(dāng)數(shù)組區(qū)間為遞增時(shí),最小值就為最左值 } else if((arr[mid-1] > arr[mid]) && (arr[mid+1] > arr[mid])) { return arr[mid];//當(dāng)取到的中間值就為旋轉(zhuǎn)點(diǎn)時(shí),最小值就為中間值 } else if((arr[left] <= arr[mid]) && (arr[mid] >= arr[right])) { left = mid + 1;//當(dāng)中間值比左邊大且比右邊大時(shí) } else { right = mid - 1;//除去上面的三種情況就只剩一種了,那就是中間值比左線小且比右邊小 } mid = (right-left)/2 + left; } return arr[left]; } int main() { int arr[] = {8, 9, 2, 3, 4, 5, 6, 7}; int ret = find_min_num(arr, sizeof(arr)/sizeof(arr[0])); cout<<"the min number is: "<<ret<<endl; return 0; }
運(yùn)行程序,輸出結(jié)果為2;
可以將數(shù)組設(shè)定為不同的情況來(lái)檢驗(yàn)。
《完》
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買多久送多久。
網(wǎng)頁(yè)標(biāo)題:輸出一個(gè)為遞增排序數(shù)組的旋轉(zhuǎn)數(shù)組中的最小元素——8-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://m.newbst.com/article14/hpide.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容