153. 无重复
Solution 1:分治的二分搜索法
时间复杂度是logn,但不是很好,因为类似分治了,每一块都递归了
class Solution {
public int findMin(int[] nums) {
int l = 0;
int r = nums.length-1;
return search(nums,l,r);
}
public int search(int[] nums, int l, int r){
if(l==r) return nums[l];
int mid = (l+r)/2;
int leftmin = search(nums,l,mid);
int rightmin = search(nums,mid+1,r);
return Math.min(leftmin,rightmin);
}
}
Solution 2: 二分搜索法2
时间复杂度是logn
但比上面能少一半吧
class Solution {
public int findMin(int[] nums) {
int l = 0;
int r = nums.length-1;
while(l<r){
int mid = (l+r)/2;
if(nums[mid]<=nums[r]){
r = mid;
}
else{
l=mid+1;
}
}
return nums[l];
}
}
154. 有重复的
直接二分搜索法
class Solution {
public int findMin(int[] nums) {
int l = 0;
int r = nums.length-1;
while(l<r){
//在上一题上,消除左边的重复
while(l+1<r&&nums[l]==nums[l+1]){
l++;
}
int mid = (l+r)/2;
if(nums[mid]<=nums[r]){
r = mid;
}
else{
l=mid+1;
}
}
return nums[l];
}
}