题目:
思路:
数组升序-------二分法
与LeetCode 34:在排序数组中查找元素的第一个和最后一个位置相似,
都用了两个变形的二分法找到数组中目标元素出现的左边界索引和右边界索引,
数字k出现的次数即为: 右边界的索引-左边界的索引+1
Java实现:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length==0){
return 0;
}
// 升序 ---二分!
int left=findLeft(array,k);
int right=findRight(array,k);
if(left==-1 && right==-1){
return 0; // 数组中不存在k值
}
return right-left+1;
}
int findLeft(int[] array,int k){ // 寻找左边界
int left=0;
int right=array.length-1;
while(left<=right){
int mid=left+(right-left)/2;
if(array[mid]<k){
left=mid+1;
}else if(array[mid]>k){
right=mid-1;
}else if(array[mid]==k && (mid==0 || array[mid-1]<k)){ //左边界
return mid;
}else{ // nums[mid]=k但不是左边界,向左继续寻找左边界
right=mid-1;
}
}
return -1; // 数组中不存在k值
}
int findRight(int[] array,int k){ // 寻找右边界
int left=0;
int right=array.length-1;
while(left<=right){
int mid=left+(right-left)/2;
if(array[mid]<k){
left=mid+1;
}else if(array[mid]>k){
right=mid-1;
}else if(array[mid]==k && (mid==array.length-1 || array[mid+1]>k)){ //右边界
return mid;
}else{ // nums[mid]=k 但不是右边界,向右继续寻找右边界
left=mid+1;
}
}
return -1; // 数组中不存在k值
}
}