下面看几道力扣上面二分查找的题目
先看一下简单的
第704题:
很简单,不多说,直接给出解答:
二分查找的具体讲解可以看我的另一篇博客
第35题:
这题也是比较简单的,直接给出答案:
只需要注意一点,就是我们循环结束的时候,i与 j 会停在什么位置,这点一定要清楚。
第34题:
这道题我一开始做错了,想复杂了,展示一下错误的案例:
后来想了一下,对代码进行分解,即分而治之,然后解答如下所示:
代码如下:
class Solution {
public int[] searchRange(int[] nums, int target) {
int x = left(nums,target);
if(x == -1){
return new int[]{-1,-1};
}else{
return new int[]{x,right(nums,target)};
}
}
public int left(int[] a,int target){
int i = 0;
int j = a.length-1;
int candidate = -1;
while(i <= j){
int m = (i+j)/2;
if(a[m]<target){
i = m+1;
}else if(target < a[m]){
j = m-1;
}else{
candidate = m;
j = m-1;
}
}
return candidate;
}
public int right(int[] a,int target){
int i = 0;
int j = a.length-1;
int candidate = -1;
while(i < j){
int m = (i+j)/2;
if(a[m]<target){
i = m+1;
}else if(target < a[m]){
j = m-1;
}else{
candidate = m;
i = m+1;
}
}
return candidate;
}
}
其实就是两个Leftmost而已,不过这道题用了分治的思想