题目链接
题目描述
统计一个数字在升序数组中出现的次数。
解题思路
- 利用二分查找,找到任意一个 k
- 由于 k 有多个,并且 当前找到的 k 可能在任意位置 。所以, 在当前 k 的前后进行遍历查找
示例
输入:
{1,2,3,3,3,3,4,5} 3
输出:
4
代码
public int GetNumberOfK(int [] array , int k) {
if (array == null || array.length == 0) {
return 0;
}
//二分查找
int start = 0, end = array.length - 1;
int t = -1;
while (start <= end) {
int mid = (start + end) / 2;
if (array[mid] == k) {
t = mid;
break;
} else if (array[mid] > k) {
end = mid - 1;
} else {
start = mid + 1;
}
}
// 如果查找的数字不在数组中
if (t == -1) {
return 0;
}
// 此时通过二分查找已经找到了其实一个
// sum用来统计总共的个数,是最后返回的值
int sum = 0;
//左侧
// t 保存的为已经找到数组的索引
int a = t;
while (a >= 0 && array[a] == k) {
sum++;
a--;
}
//右侧
a = t + 1;
while (a < array.length && array[a] == k) {
sum++;
a++;
}
return sum;
}