最好还是自己想
寻找一个数
int binarySearch(int[] nums, int target) {
int left = 0;
int right = nums.length - 1; // 注意
while(left < right) {
int mid = left + (right - left) / 2;
if(nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1; // 注意
else if (nums[mid] > target)
right = mid; // 注意
}
return -1;
}
寻找左侧边界
public int leftBound(int[] nums, int target){
if(nums.length==0) return -1;
int l=0;
int r=nums.length-1;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]<target){
l=mid+1;
}else if(nums[mid]>target){
r=mid-1;
}else{
r=mid-1;
}
}
if(l<0||nums[l]!=target) return -1;
return l;
}
寻找右侧边界
public int rightBound(int[] nums, int target){
if(nums.length==0) return -1;
int l=0;
int r=nums.length-1;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]<target){
l=mid+1;
}else if(nums[mid]>target){
r=mid-1;
}else{
l=mid+1;
}
}
if(r<0||nums[r]!=target) return -1;
return r;
}
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I
找到最左侧下标,向右遍历
注意需要判断返回的下标是否符合要求
比如:
[5,7,7,8,8,10]
6
返回的index=1,但实际上nums[1]=7,不等于6
class Solution {
public int search(int[] nums, int target) {
int l=0, r=nums.length-1;
while(l<r){
int mid=l+(r-l)/2;
if(nums[mid]>target){
r=mid-1;
}else if(nums[mid]<target){
l=mid+1;
}else{
r=mid;
}
}
int count=0;
for(int i=l;i<nums.length;i++){
if(nums[i]==target) count++;
else break;
}
return count;
}
}