描述
统计一个数字在升序数组中出现的次数。
示例1
输入: [1,2,3,3,3,3,4,5],3
返回值: 4
思路:
二分法
左边界 表示第一个为k的位置
右边界 表示第一个比k大的位置
右边界减去左边界 就是k出现的次数
数组包含k的情况:
数组不包含k的情况:
时间复杂度:O(logN)
空间复杂度:O(1)
代码:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if (array == null || array.length == 0) {
return 0;
}
//左边界 表示第一个为k的位置
int lbound = binarySearch(array, k);
//右边界 表示第一个比k大的位置
int rbound = binarySearch(array, k+1);
//不包含k值 直接返回0
if (lbound == array.length || array[lbound] != k) {
return 0;
}
return rbound - lbound;
}
//二分法
//如果不包含k值 返回的是第一个大于k的位置
//有可能返回array.length 数组中所有数都小于k
private int binarySearch(int [] array , int k) {
int left = 0;
int right = array.length;
while(left < right) {
int mid = (left+right)/2;
if(array[mid] >= k) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
}