求旋转数组的最小数字C++
發(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)題。
- 上一篇: 白凤丸的功效与作用、禁忌和食用方法
- 下一篇: 两数之和,输入有序数组 leetcode