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

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

生活随笔

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

c/c++

求旋转数组的最小数字C++

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

發(fā)現(xiàn)還是數(shù)組這種最簡(jiǎn)單的編碼才適合我,遇到樹(shù),鏈表這些真的是一頭霧水,自己也不知道怎么實(shí)現(xiàn)。言歸正傳,該篇文章介紹如何求旋轉(zhuǎn)數(shù)組的最小值,求最大值可以適當(dāng)改編即可。

什么是旋轉(zhuǎn)數(shù)組呢,就是將一個(gè)數(shù)組的前幾個(gè)元素和后面幾個(gè)元素互換位置。例如原數(shù)組(升序的數(shù)組)為{0,1,2,3,4,5,6,7,8,9},將其旋轉(zhuǎn)后變?yōu)閧5,6,7,8,9,0,1,2,3,4}。如何求該數(shù)組的最小值呢,有一種方法是直接按順序比較,但是這就體現(xiàn)不出旋轉(zhuǎn)數(shù)組的特性了,所以更好的解法應(yīng)該是采用二分法來(lái)求得該數(shù)組的最小值。我們可以發(fā)現(xiàn)在旋轉(zhuǎn)數(shù)組中9坐標(biāo)的數(shù)都比它小,右邊的數(shù)也都比它小。我們?cè)O(shè)有2個(gè)指針,左指針指向最左邊的元素,右指針指向最右邊的元素。我們判斷中間的元素和最左邊元素的大小,如果中間的數(shù)大于左指針指向的元素,證明最小的數(shù)字在中間數(shù)字的右邊。這樣我們就可以縮小范圍啦。

代碼如下

#include<iostream> #include<cstdlib> #include <stack> #include <stdio.h> #include<time.h>using namespace std;int Min(int a[], int length) {if (a == nullptr || length <= 1) //如果出現(xiàn)數(shù)組中只有一個(gè)元素的就直接報(bào)錯(cuò)吧throw new exception("Invalid parameters");int left = 0;int right = length - 1;while (a[left] > a[right]) {if (right <= left+2) //數(shù)組中有2個(gè)或者三個(gè)元素,最右邊的元素都是最小的return a[right];int mid = (left + right) / 2;if (a[mid] >= a[left])left = mid;else if (a[mid] < a[right])right = mid;}return a[right]; }int main() {int a[] = { 44,45,46,1,2,3,15,33,41 };int min=Min(a, 6);cout << min << endl;system("pause");}

不過(guò)很顯然這種方法不是很完善的,因?yàn)闆](méi)有考慮一種比較特殊的情況,就是數(shù)組中擁有重復(fù)元素的時(shí)候。比如數(shù)組{1,1,1,0,1},{1,0,1,1,1}。這種時(shí)候就只能選擇順序查找的辦法啦。

改進(jìn)代碼如下:

#include<iostream> #include<cstdlib> #include <stack> #include <stdio.h> #include<time.h>using namespace std;int MinInOder(int a[], int left,int right) {int result = a[left];for (int i = left+1; i < right; i++){if (a[i] < result)result = a[i];}return result; }int Min(int a[], int length) {if (a == nullptr || length <= 1)throw new exception("Invalid parameters");int left = 0;int right = length - 1;while (a[left] >=a[right]){if (right <= left+2)return a[right];int mid = (left + right) / 2;if (a[right] == a[left]&& a[mid] == a[right])return MinInOder(a, left,right);if (a[mid] >= a[left])left = mid;else if (a[mid] <= a[right])right = mid;}return a[right]; }int main() {int a[] = { 1,1,1,1,0,1,1,1,1 };int min=Min(a, 6);cout << min << endl;system("pause");}

?

總結(jié)

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

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