找出旋转数组的最小的元素
来源:互联网 发布:工业设计软件图标 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 找出旋转数组的最小的元素
- 找出旋转数组中最小的元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- 旋转数组的最小元素
- [算法]找出旋转数组的最小数字
- 找出数组中最小的元素
- 旋转数组的最小元素--总结
- 面试训练旋转数组的最小元素
- 剑指offer- 旋转数组的最小元素
- 剑指offer--找出旋转数组中的最小元素
- 阿里云远程连接服务器出错
- CF 122A- Lucky Division
- 单片机实验5
- 习题8(8.6)
- input合并
- 找出旋转数组的最小的元素
- Android开发学习之路--NDK、JNI之初体验
- android boot image格式分析
- Win7命令终端基础配色指南
- unity cardboard 导出
- MFC常用API
- CGI、fastCGI、php-fpm都是什么?其工作原理流程是怎样的?
- [kuangbin带你飞]专题1 简单搜索 G
- mysql的in和exists