题目描述
统计一个数字在排序数组中出现的次数。
方法一,直接遍历
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++;
}
}
return count;
}
}
方法二,看到有序–二分查找
找到第一次出现的位置,最后一次出现的位置,相减+1即可
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0) return 0;
int firstIndex = getFirst(array,0,array.length - 1,k);
int lastIndex = getLast(array,0,array.length - 1,k);
if(firstIndex == -1 || lastIndex == -1){
return 0;
}else{
return lastIndex - firstIndex + 1;
}
}
//遍历实现
public int getFirst(int[] array,int left,int right,int k){
while(left <= right){
int mid = left + (right - left) / 2;
if(k < array[mid]){
right = mid - 1;
}else if(k > array[mid]){
left = mid + 1;
}else if(mid > 0 && array[mid-1] == k){
right = mid - 1;
}else{
return mid;
}
}
return -1;
}
//递归实现
public int getLast(int[] array,int left,int right,int k){
if(left > right) return -1;
int mid = left + (right - left) / 2;
if(k < array[mid]){
return getLast(array,left,mid-1,k);
}else if(k > array[mid]){
return getLast(array,mid+1,right,k);
}else if(mid < array.length - 1 && array[mid+1] == k){
return getLast(array,mid+1,right,k);
}else{
return mid;
}
}
}