问题描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组[0,1,1,4,5,6,7]
可能变为[4,5,6,7,0,1,2]
)。请找出其中最小的元素。
你可以假设数组中不存在重复元素。
输
入
:
[
3
,
4
,
5
,
1
,
2
]
输入:[3,4,5,1,2]
输入:[3,4,5,1,2]
输
出
:
1
输出:1
输出:1
解题报告
- 暴力搜索
直接遍历数组,当后一个元素小于前一个元素时,返回。
时间复杂度: O ( N ) O(N) O(N) - 二分法
通过分析 中值 和 右值 的大小关系
1) 中 值 > 右 值 中值>右值 中值>右值,则说明目标值在右半边;
2) 中 值 < 右 值 中值<右值 中值<右值,则说明目标值在左半边;
实现代码
- 暴力方法
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==1) return nums[0];
for(int i=0;i<nums.size()-1;i++){
if(nums[i+1]-nums[i]<0){
return nums[i+1];
}
}
return nums[0];
}
};
- 二分法
class Solution{
public:
int findMin(vector<int>&nums){
int l=0,r=nums.size()-1;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]>nums[r]){
l=mid+1;
}
else{
r=mid;
}
}
return nums[l];
}
};