*剑指 Offer 53 - I. 在排序数组中查找数字 I - 12.30
统计一个数字在排序数组中出现的次数。
解法一:使用二分查找,对比中间值,找到后分别统计左右两边与目标值相等的次数。
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
if(len < 0) return 0;
int left = 0;
int right = len-1;
int count = 1;
while(left <= right){ //二分查找
int mid = (left + right) //中间值
if(target > nums[mid]){ //如果目标值 大于 当前中间值,移动左边界
left = mid+1;
}else if(target < nums[mid]){ //如果目标值 小于 当前中间值,移动右边界
right = mid-1;
}else{ //相等
int l=mid-1,r=mid+1;
while(r < len){ //统计右边
if(target == nums[r]){
count++;
}
r++;
}
while(l>=0){ //统计左边
if(target == nums[l]){
count++;
}
l--;
}
return count;
}
}
return 0;
}
}
解法二:二分查找
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
if(len < 0) return 0;
//左边界
int left = searchLeft(nums,target);
//右边界
int right = searchRight(nums,target);
//判断是否合法
if(left<=right && right<len && nums[left] == target && nums[right]== target){
return right-left+1;
}
return 0;
}
//找左边界的二分查找
public int searchLeft(int[] nums, int target){
int left = -1, right = nums.length;
while(left+1 != right){
int mid = (left+right)/2;
if(nums[mid] >= target){
right = mid;
}else{
left = mid;
}
}
return right;
}
//找右边界的二分查找
public int searchRight(int[] nums, int target){
int left = -1, right = nums.length;
while(left+1 != right){
int mid = (left+right)/2;
if(nums[mid] <= target){
left = mid;
}else{
right = mid;
}
}
return left;
}
}