找出旋转数组的最小的元素

来源:互联网 发布:工业设计软件图标 编辑:程序博客网 时间:2024/05/22 01:48

问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

函数接口:

int minNumberInRotateArray(vector<int> rotateArray)

解题方法1:直接遍历整个数组,找出最小的元素,时间复杂度为O(n),这种方法很简单就不多说了。

方法2:因为旋转后的数组是两个递增的有序数列,所以我们可以使用二分查找法逐渐缩小范围,设置两个标记left指向第一个元素位置,right指向最后一个元素的位置,如果中间元data[mid]>left,则表示最小元素在第二个数组中,然后使left=mid,如果data[mid]<data[right]表示最小元素再前面,此时right=mid,直到找到满足right-left==1的结果,这个时候right就是最小的元素。第一组的所有元素大于第二组的所有元素,而且第一组的最后一个元素的屁股后面紧跟着的就是最小的元素,即第二组的第一个元素。算法代码:


算法代码如下:

int minNumberInRotateArray(vector<int> rotateArray){int right = rotateArray.size() - 1;int left = 0;while ((left<right)){int mid = (right - left) / 2 + left;if (right - left == 1)return rotateArray[right];if (rotateArray[mid]>rotateArray[left])left = mid;if (rotateArray[mid] < rotateArray[right])right = mid;if (rotateArray[left] == rotateArray[mid] && rotateArray[right] == rotateArray[mid]){int n = rotateArray.size();int tmp = rotateArray[0];for (int i = 0; i < n-1; i++){if (tmp>rotateArray[i + 1])tmp = rotateArray[i + 1];}return tmp;}}return -1;}

全部代码和测试结果:

#include<iostream>#include<vector>using namespace std;class Solution {public:int minNumberInRotateArray(vector<int> rotateArray){int right = rotateArray.size() - 1;int left = 0;while ((left<right)){int mid = (right - left) / 2 + left;if (right - left == 1)return rotateArray[right];if (rotateArray[mid]>rotateArray[left])left = mid;if (rotateArray[mid] < rotateArray[right])right = mid;if (rotateArray[left] == rotateArray[mid] && rotateArray[right] == rotateArray[mid]){int n = rotateArray.size();int tmp = rotateArray[0];for (int i = 0; i < n-1; i++){if (tmp>rotateArray[i + 1])tmp = rotateArray[i + 1];}return tmp;}}return -1;}};int main(){vector<int> arr1 = { 2, 2, 3, 4, 5, 6, 6 };//2vector<int> arr2 = { 3,4,5,1,2};//1vector<int> arr3 = { 1,0,1,1,1};//0Solution test;cout << test.minNumberInRotateArray(arr1) << endl;cout << test.minNumberInRotateArray(arr2) << endl;cout << test.minNumberInRotateArray(arr3) << endl;system("pause");return 0;}

原创粉丝点击