面試題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;
}
}