寻找旋转排序数组中的最小值 II
假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
数组中可能存在重复的元素。
样例
给出[4,4,5,6,7,0,1,2] 返回 0
标签
二分法 分治法
相关题目
中等寻找旋转排序数组中的最小值 39 %
中等搜索旋转排序数组 II 40 %
(1)Java
// // version 1: just for loop is enough
// public class Solution {
// public int findMin(int[] num) {
// // 这道题目在面试中不会让写完整的程序
// // 只需要知道最坏情况下 [1,1,1....,1] 里有一个0
// // 这种情况使得时间复杂度必须是 O(n)
// // 因此写一个for循环就好了。
// // 如果你觉得,不是每个情况都是最坏情况,你想用二分法解决不是最坏情况的情况,那你就写一个二分吧。
// // 反正面试考的不是你在这个题上会不会用二分法。这个题的考点是你想不想得到最坏情况。
// int min = num[0];
// for (int i = 1; i < num.length; i++) {
// if (num[i] < min)
// min = num[i];
// }
// return min;
// }
// }
public class Solution {
/**
* @param nums: a rotated sorted array
* @return: the minimum number in the array
*/
public int findMin(int[] nums) {
if(nums == null || nums.length == 0){
return -1;
}
int start = 0, end = nums.length - 1;
int mid;
while(start + 1 < end){
mid = start + (end - start) / 2;
if(nums[mid] == nums[end]){
end--;
}
else if(nums[mid] < nums[end]){ //千万!!勿漏else!!!
end = mid;//注意--题目要求找min!而非max!
}else{
start = mid;
}
}
if(nums[start] <= nums[end]){
return nums[start];
}
return nums[end];
}
}
(2)C++
class Solution {
public:
/**
* @param num: the rotated sorted array
* @return: the minimum number in the array
*/
int findMin(vector<int> &num) {
// write your code here
int lo = 0;
int hi = num.size()-1;
while(lo<hi){
int mid = lo + (hi - lo)/2;
if(num[mid]>num[hi]){
lo = mid+1;
}else if(num[mid]<num[hi]){
hi = mid;
}else{
hi--;
}
}
return num[lo];
/*
int st = 0;
int ed = num.size()-1;
while(st<ed){
int mid = st+(ed-st)/2;
if(num[mid] > num[ed]){
st = mid+1;
}else if(mid[mid] < num[ed]){
ed = mid;
}else {
ed--;
}
}
return num[st];
*/
}
};