/**
* 在排序數組中查找數字
* 統計一個數字在排序數組中出現的次數
*
* @param arr
* @return
*/
public int getNumberOfK(int[] arr, int k) {
if (null == arr || 0 == arr.length) return 0;
int first = getFirstIndex(arr, k);
int last = getLastIndex(arr, k);
if (first == -1 && last == -1) return 0;
return last - first + 1;
}
/**
* 獲取k第一次出現的位置
*
* @param arr
* @param k
* @return
*/
private int getFirstIndex(int[] arr, int k) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (arr[mid] > k) {
right = mid - 1;
} else if (arr[mid] < k) {
left = mid + 1;
} else {
if (mid == 0 || arr[mid - 1] != k) return mid;
right = mid - 1;
}
}
return -1;
}
/**
* 獲取k最後一次出現的位置
*
* @param arr
* @param k
* @return
*/
private int getLastIndex(int[] arr, int k) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (arr[mid] > k) {
right = mid - 1;
} else if (arr[mid] < k) {
left = mid + 1;
} else {
if (mid == arr.length - 1 || arr[mid + 1] != k) return mid;
left = mid + 1;
}
}
return -1;
}
劍指Offer學習-面試題53:在排序數組中查找數字
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.