剑指 Offer 53 - I. 在排序数组中查找数字 I
题目:统计一个数字在排序数组中出现的次数
解法一:二分法+遍历
思路:先用二分法确定target所在的区间[l,r],再逐个判断元素是否target,遍历时会浪费一些不必要的时间
代码:
class Solution {
public int search(int[] nums, int target) {
int l=0,r=nums.length-1;
int count=0;
while(l<=r){
int m = (l+r)/2;
if(nums[m]target){
break;
} else if(nums[m]<target){
l = m+1;
} else{
r = m-1;
}
}
for(int i=l;i<=r;i++){
if(nums[i]==target){
count++;
}
}
return count;
}
}
解法二:二分法
思路:用二分法确定包含所有target的两条边界,那么target出现的次数就是:右边界-左边界-1
class Solution {
public int search(int[] nums, int target) {
int l=0,r=nums.length-1;
//找右边界
while(l<=r){
int m = (l+r)/2;
if(nums[m]target){ //右边界在[m+1,r]中
l=m+1;
} else if(nums[m]<target){
l = m+1;
} else{
r = m-1;
}
}
int rborder=l;
if((r>=0&&nums[r]!=target)||r<0){ //如果不存在target,提前返回
return 0;
}
l=0; //r不需重新赋值
//找左边界
while(l<=r){
int m = (l+r)/2;
if(nums[m]target){ //左边界在[l,m-1]中
r=m-1;
} else if(nums[m]<target){
l = m+1;
} else{
r = m-1;
}
}
int lborder=r;
return rborder-lborder-1;
}
}

浙公网安备 33010602011771号