题目描述
统计一个数字在排序数组中出现的次数。
解题思路
- 有以下几种情况:(假设k=5)
// 都比k大,array={6,7,8,9,10}
// 都比k小,array={1,1,2,3,4}
// k不在里面,array={1,2,3,6,7,8}
// array={5,5,6,7,8}
// array={1,2,3,5,5,6,7,8}
// array={1,2,3,5,5} - 本题的一个bug,没有说数组是正序排列还是倒序排列;
- 既然是排序数组,那么效率最高的是二分查找;
- 从高位查找,如果当前数字小于等于k则停止高位查找
- 此时,如果该位小于等于k,则可能后面还有等于k的数,所以继续遍历这个位置的后面,直到index==array.length-1或者array[index]大于k停止。
- 对低位的index同理,然后遍历从low到high到所有元素,找出等于k的值。
代码
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0) return 0;
int low = 0, high = array.length - 1, count = 0;
while(high > 0 && array[(high + 1) / 2] > k){
high = high / 2;
}
while(high < array.length-1 && array[high] <= k) {
high++;
}
while(array[low + (high + 1 - low) / 2] <= k && low < array.length - 1){
low += (high+1 - low) / 2;
}
while(low > 0 && array[low] == k){
low--;
}
while(low <= high){
if(array[low] == k){
count++;
}
low++;
}
if(low == high && array[low] == k) return 1;
return count;
}
}