题目描述:
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
class Solution {
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length;
int start = leftBorder(l,r,nums,target);
int end = rightBorder(l,r,nums,target);
if(start == -1 && end == -1){
return 0;
}else {
return end - start +1 ;
}
}
private int rightBorder(int l,int r,int[] nums,int target) {
while (l < r){
int mid = l + (r-l)/2;
if(nums[mid] == target){
l = mid+1;
}else if(nums[mid] > target){
r = mid;
}else if(nums[mid] <target){
l = mid+1;
}
}
if(l == 0){
return -1;
}
return nums[l-1] == target?l-1:-1;
}
private int leftBorder(int l,int r,int[] nums,int target ){
while (l < r){
int mid = l + (r-l)/2;
if(nums[mid] == target){
r = mid;
}else if(nums[mid] > target){
r = mid ;
}else if(nums[mid] < target){
l = mid + 1;
}
}
if(l == nums.length){
return -1;
}
return nums[l] == target? l : -1;
}
}
思路概述:
通过二分,找到target数字的左边界和右边界