题目描述:
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.
Example 1:
Input: [3,4,5,1,2] Output: 1
Example 2:
Input: [4,5,6,7,0,1,2] Output: 0
思路:
旋转数组可以看成两个递增的子数组,所以我们可以利用二分法来查找最小值,而最小值就是比某一个边界值小的值,这个边界值我们确定为第二个递增数组中的最后一个元素。我们的目标是寻找数组中第一个比这个边界值小的元素,利用二分法来确定即可。
实现1:
class Solution {
public int findMin(int[] nums) {
if(nums==null||nums.length==0){
return 0;
}
int low=0;
int high=nums.length-1;
int target=nums[nums.length-1];
while(low+1<high){
int mid=(low+high)/2;
if(nums[mid]<=target){
high=mid;
}else{
low=mid;
}
}
if(nums[low]<=target){
return nums[low];
}else{
return nums[high];
}
}
}
实现2:
public int findMin(int[] nums) {
if(nums==null||nums.length==0){
return 0;
}
int low=0,high=nums.length-1;
while(low<high){
int mid=(low+high)/2;
if(nums[mid]<nums[high]){
high=mid;
}else{
low=mid+1;
}
}
return nums[low];
}