题目描述
统计一个数字在排序数组中出现的次数。
解题思路
-
解法1
遍历数组,比较给定值和数组中元素的值。 -
二分查找
我们需要找到第一个和最后一个k,如果中间值大于给定值k,那么k在前半段,小于k则在后半段。相等,则判断前面的值是否等于k,如果相等,说明第一个k在前面,否则第一个k就是当前值。同理找到最后一个k。因为是排序的,所以k都在一起,就可以通过最后一个k和第一个k求出k的个数。
实现
这里实现第二种解法。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if (array == null || array.length <= 0) return 0;
int first = getFirstK(array,k,0,array.length-1);
if (first == -1) return 0;
int last = getLastK(array,k,0,array.length-1);
return last - first + 1;
}
private int getLastK(int[] array, int k, int start, int end) {
if (start > end) return -1;
int mid = (start+end) / 2;
if (array[mid] > k){
return getLastK(array, k, start, mid - 1);
}else if (array[mid] < k){
return getLastK(array, k, mid + 1, end);
}else {
if (mid==end || (mid < end && array[mid+1] != k)){
return mid;
}else {
return getLastK(array, k, mid+1, end);
}
}
}
private int getFirstK(int[] array, int k, int start, int end) {
if (start > end) return -1;
int mid = (start+end) / 2;
if (array[mid] > k){
return getFirstK(array, k, start, mid - 1);
}else if (array[mid] < k){
return getFirstK(array, k, mid + 1, end);
}else {
if (mid==start || (mid > start && array[mid-1] != k)){
return mid;
}else {
return getFirstK(array, k, start, mid-1);
}
}
}
}