问题描述
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.
解题思路
题目给出的这个问题很简单:有一个升序的数组在轴上旋转,不知道头在哪,要求我们找出最小值,开始的思路很简单:由于数组是升序的,如果头不在首位,那么在只会在头尾交接处会出现后一个值小与前一个值的情况,只要遍历进行判断即可:
代码如下:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int findMin(vector<int>& nums) {
int min = nums[0];
for(int i=1;i<nums.size();i++){
if(nums[i]< nums[i-1]){
min = nums[i];
break;
}
}
return min;
}
};
int main(){
int n;
cout<<"请输入向量的长度n:";
cin>>n;
vector<int> nums;
cout<<"请输入向量的元素:";
while(n--){
int a;
cin>>a;
nums.push_back(a);
}
Solution solution;
int result = solution.findMin(nums);
cout<<"最小值为:"<<result<<endl;
return 0;
}
这种方法复杂度为O(n),我们可以采用另一种方式二分法,这种方法复杂度为O(log n)。代码如下:
class Solution {
public:
int findMin(vector<int>& nums) {
int size = nums.size();
int left = 0,right = size - 1;
int mid = 0;
// num[left] > num[right] 确保旋转
while(nums[left] > nums[right]){
// 分界点
if(right - left == 1){
mid = right;
break;
}//if
mid = left + (right - left) / 2;
// 中间元素位于前面的递增子数组
// 此时最小元素位于中间元素的后面
if(nums[mid] > nums[left]){
left = mid;
}//if
// 中间元素位于后面的递增子数组
// 此时最小元素位于中间元素的前面
else{
right = mid;
}
}//while
return nums[mid];
}
};
运行结果展示