题目描述:统计一个数字在排序数组中出现的次数。
思路:因为没有表明是升序还是降序,所以要谨慎一些。从脑子里蹦出的第一个想法就是遍历数组,记录要查找数字的数目,并且判断该数字的下一个数字,如果也等于k,则继续,不等于k,则直接终止,返回个数。
二分查找:找到数组中该数字第一个出现的位置和最后一个出现的位置,两个数相减即为个数。
代码一:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0){
return 0;
}
int count = 0;
for(int i = 0; i < array.length; i++){
if(array[i] == k){
count++;
if(i < array.length - 1 && array[i + 1] != k){
return count;
}
}
}
return count;
}
}
代码二:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0){
return 0;
}
int firstk = firstK(array, k, 0, array.length - 1);
int lastk = lastK(array, k, 0, array.length - 1);
if(firstk != -1 && lastk != -1){
return Math.abs(lastk - firstk + 1);
}
return 0;
}
public int firstK(int[] arr, int k, int start, int end){
while(start <= end){
int mid = start + ((end - start) >> 1);
if(arr[mid] > k){
end = mid - 1;
}else if(arr[mid] < k){
start = mid + 1;
}else if((mid - 1) >= 0 && arr[mid - 1] == k){//先判断边界
end = mid - 1;
}else{
return mid;
}
}
return -1;
}
public int lastK(int[] arr, int k, int start, int end){
while(start <= end){
int mid = start + ((end - start) >> 1);
if(arr[mid] > k){
end = mid - 1;
}else if(arr[mid] < k){
start = mid + 1;
}else if((mid + 1) < arr.length && arr[mid + 1] == k){//先判断边界
start = mid + 1;
}else{
return mid;
}
}
return -1;
}
}