标签:
统计一个数字在排序数组中出现的次数。
方法一:暴力
线性遍历
方法二:二分法
分别求出左右边界
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array == null|| array.length==0)
return 0;
int low = 0;
int high = array.length -1;
int l = left(array,low,high,k);
if(l ==-1)
return 0;
int r = right(array,l,high,k);
return r-l + 1;
}
// 求左边界
public int left(int[] array,int low ,int high,int k){
if(array[low] == k)
return low;
while(low <= high){
int mid = low + (high - low)/2;
if(mid >=1 && array[mid-1]!=k && array[mid] ==k) // mid - 1越界要判断
return mid;
if(array[mid] >=k){ // 考虑等于
high = mid - 1;
}else {
low = mid + 1;
}
}
return -1;
}
// 求右边界
public int right(int[] array,int low ,int high,int k){
if(array[high] == k)
return high;
while(low <= high){
int mid = low + (high - low)/2;
if(mid + 1 < array.length && array[mid]==k && array[mid+1] !=k) // mid + 1越界要判断
return mid;
if(array[mid] >k){
high = mid - 1;
}else { // 等于在这里考虑
low = mid + 1;
}
}
return -1;
}
}
当然也可以求出一个边界,然后再线性查找
标签:
原文地址:http://blog.csdn.net/qunxingvip/article/details/51747272