1.この質問の知識ポイント
二分探索
2.タイトルの説明
昇順の配列に数値が表示される回数を数えます。
输入:
[1,2,3,3,3,3,4,5],3
返回:
4
3.問題解決のアイデア
二分法を使用して、繰り返される要素が表示される最初の添え字を見つけ、次に二分法を使用して、繰り返される要素が表示される最後の添え字を見つけ、減算して出現回数を取得します。
4.コード
public class Solution {
public int GetNumberOfK(int[] array, int k) {
int firstIndex = GetFirstIndex(array, k);
int lastIndex = GetLastIndex(array, k);
if (firstIndex == -1 || lastIndex == -1) {
return 0;
}
return lastIndex - firstIndex + 1;
}
public int GetFirstIndex(int[] array, int k) {
int high = array.length - 1;
int low = 0;
while (low <= high) {
int mid = (low + high) / 2;
if (k > array[mid]) {
// 如果 k > 中间值,则在右半数组查找
low = mid + 1;
} else if (k < array[mid]) {
// 如果 k < 中间值,则在左半数组查找
high = mid - 1;
} else {
// 如果 k = 中间值,则判断 mid-1 是否等于 k
mid = mid - 1;
if (mid < low || array[mid] != k) {
// 不等于 k,则找到第一个下标
return mid + 1;
} else {
// 等于 k,继续二分查找
high = mid;
}
}
}
return -1;
}
public int GetLastIndex(int[] array, int k) {
int high = array.length - 1;
int low = 0;
while (low <= high) {
int mid = (low + high) / 2;
if (k > array[mid]) {
low = mid + 1;
} else if (k < array[mid]) {
high = mid - 1;
} else {
mid = mid + 1;
if (mid > high || array[mid] != k) {
return mid - 1;
} else {
low = mid;
}
}
}
return -1;
}
}