Binary5

题目描述[原题连接][https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/]

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

你可以假设数组中不存在重复元素。

示例 1:

输入: [3,4,5,1,2]
输出: 1

示例 2:

输入: [4,5,6,7,0,1,2]
输出: 0

算法描述

​ 给定的数组是升序数组旋转得到的,假设最小值的下标为mid,该数组满足mid前的都大于nums[mid],并且是升序排列,mid后面的元素也是都大于nums[mid],并且升序排列,所以二分法可以找到我们要找的目标值。

​ 二分法的时间复杂度:O(logn)

C++解法一

1
2
3
4
5
6
7
class Solution {
public:
int findMin(vector<int>& v) {
sort(v.begin(),v.end());
return v[0];
}
};

C++解法二

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int findMin(vector<int>& v) {
int l=0;
int r=v.size()-1;
while(l<r){
int mid = l+(r-l)/2;
if(v[mid]>v[r])l=mid+1;
if(v[mid]<v[r])r=mid;
}
return v[r];
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int findMin(int[] nums) {
if(nums[nums.length-1]>nums[0])return nums[0];
int l = 0;
int r = nums.length-1;
while(r>l){
int mid = l+(r-l)/2;
if(nums[mid]>=nums[0])l=mid+1;
else r=mid;
}
return nums[r];
}
}