版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majichen95/article/details/82555627
假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
数组中可能存在重复的元素。
样例
给出[4,4,5,6,7,0,1,2] 返回 0
注意事项
The array may contain duplicates.
解题思路:
相比于上一道Lintcode 159. 寻找旋转排序数组中的最小值,此题多了重复元素的条件,注意考虑重复元素同时出现在首尾的情况,例如[1,1,-1,1],这样的话就不能利用r元素的大小来判断mid所在的区间了,此时就只能移动r元素,直到它不等于l的值,即可判断。
就多了两行代码,如下:
public class Solution {
/**
* @param nums: a rotated sorted array
* @return: the minimum number in the array
*/
public int findMin(int[] nums) {
// write your code here
if(nums[0] < nums[nums.length-1])
return nums[0];
int l = 0;
int r = nums.length-1;
while(nums[l]==nums[r] && r>0)
r--;
while(l<r){
int mid = (r-l)/2+l;
if(nums[mid]>nums[r])
l = mid + 1;
else
r = mid;
}
return nums[l]<nums[r]?nums[l]:nums[r];
}
}