面试题53 - I. 在排序数组中查找数字 I
统计一个数字在排序数组中出现的次数。
考察如何优化 查找算法!
思路 二分查找
采用二分查找, 找出目标元素地左右边界。
- 时间 O(NlogN)
public class Solution {
public int GetNumberOfK(int [] array , int k) {
// 二分查找 给定元素的左右边界: 结果等于 (high - low +1)
if(array.length <=0) return 0;
int i = 0;
int j = array.length -1;
// 二分法确定右边界(最后一个该元素的位置)
while(i <= j){
int mid = i+ (j - i) / 2;
// 等于k的时候也要右移, 不断逼近右边的边界。
if(array[mid] <= k){
i = mid + 1;
}else{
j = mid - 1;
}
}
int high = i; // 右边界确定。
// 确定左边界
i = 0;
j = array.length -1;
while(i <= j){
int mid = i + (j -i) / 2;
// 等于的时候右指针不断地往左移动, 直到找到第一个与之相等地元素,即确定左边界。
if(array[mid] >= k) j = mid-1;
else i = mid + 1;
}
int low = j;// 左边界确定。
// (high 和low 在判断边界条件的时候都多加了一次, 所以最后结果要减掉1)
return high - low -1;
}
}