把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个升序的数组的一个旋转,输出旋转数组的最小元素。
例如数组 {3,4,5,1,2}为 {1,2,3,4,5} 的一个旋转,该数组的最小值为 1。
数组可能包含重复项。
注意:数组内所含元素非负,若数组大小为 0,请返回 −1−1。
数据范围
数组长度 [0,90]。
样例
输入:nums = [2, 2, 2, 0, 1]
输出:0
题解一:利用二分的思想
class Solution {
public int findMin(int[] nums) {
if(nums.length==0)return -1;
int n = nums.length-1;
while(n>0 && nums[n]==nums[0])n--; //消除最右侧的重复元素
int left=0,right=n;
if(nums[0]<nums[n]) return nums[0]; //初试状态即为有序的
while(left < right){
int mid = (left+right)/2;
if(nums[mid]<nums[0]) right = mid;
else left = mid+1;
}
return nums[right];
}
}
题解二:遍历所有元素,找到最小的
class Solution {
public int findMin(int[] nums) {
if(nums.length==0)return -1;
int min = nums[0];
for(int i = 0;i<nums.length;i++){
if(nums[i]<min)min = nums[i];
}
return min;
}
}