问题
例子
思路
左边递增的部分>右边递增的最大值
-
方法1 O(n)
遍历 -
方法2 O(logn)
二分查找
代码
//方法1
class Solution {
public int findMin(int[] nums) {
for(int i=1; i<nums.length; i++){
if(nums[i]<nums[i-1]) return nums[i];
}
return nums[0];
}
}
//方法2
class Solution {
public int minArray(int[] nums) {
int i=0,j=nums.length-1;
//左边的数一定大于右边的最大数
while(i<j){
int mid=i+(j-i)/2;
//[3,4,5,6,0,1,2],此时mid在左边递增部分,最小数字一定在mid的右边
if(nums[mid]>nums[j]) i=mid+1;
else
//此时mid在右边递增部分,最小数可能为mid,或者mid的左边
if(nums[mid]<nums[j]) j=mid;
//此时不确定mid在左边递增还是右边递增,最小值可能在mid左边,也可能在mid右边,但不会是在j上,即便在j上,由于nums[mid]和nums[j]一样,结果还在i~j中
else j-=1;
}
return nums[i];
}
}