劍指offer -- 數字在排序陣列中出現的次數
阿新 • • 發佈:2018-11-05
題目描述
統計一個數字在排序陣列中出現的次數。
解題思路
因為題目給出的陣列是排序了的,所以我們想到了二分查詢。利用二分查詢找到一個數字在陣列中第一次出現的位置和最後出現的位置即可。
AC程式碼
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0) return 0;
int indexOfFirstK = getIndexOfFirstK(array, k);
int indexOfLastK = getIndexOfLastK(array, k);
if(indexOfFirstK == -1) return 0;
return indexOfLastK - indexOfFirstK + 1;
}
//找出 k 在陣列中第一次出現的位置
private int getIndexOfFirstK(int[] array, int k){
//int indexOfFirstK = -1;
int low = 0;
int high = array.length - 1;
while(low <= high){
int mid = (low + high) >> 1;
if(array[mid] == k){
if(mid == 0) return 0;
else if(array[mid - 1] != k)
return mid;
else high = mid - 1;
}
else if(array[mid] > k) high = mid - 1;
else low = mid + 1;
}
return -1;
}
//找出 k 在陣列中最後一次出現的位置
private int getIndexOfLastK(int[] array, int k){
//int indexOfFirstK = -1;
int low = 0;
int high = array.length - 1;
while(low <= high){
int mid = (low + high) >> 1;
if(array[mid] == k){
if(mid == array.length - 1) return array.length - 1;
else if(array[mid + 1] != k)
return mid;
else low = mid + 1;
}
else if(array[mid] > k) high = mid - 1;
else low = mid + 1;
}
return -1;
}
}