您的位置:首页 > 其它

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

2017-12-23 13:03 211 查看
问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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 };//2
vector<int> arr2 = { 3,4,5,1,2};//1
vector<int> arr3 = { 1,0,1,1,1};//0
Solution test;
cout << test.minNumberInRotateArray(arr1) << endl;
cout << test.minNumberInRotateArray(arr2) << endl;
cout << test.minNumberInRotateArray(arr3) << endl;
system("pause");
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: