统计一个数字在排序数组中出现的次数。
二分查找:
public class T_37_GetNumberOfK {
//二分查找
public int GetNumberOfK(int[] array, int k) {
if (array == null || array.length == 0) {
return 0;
}
int l = getFirst(array, k);
int r = getLast(array, k);
if (l != -1 && r != -1) {
return r - l + 1;
}
return 0;
}
private int getFirst(int[] array, int k) {
int l = 0;
int r = array.length - 1;
while (l <= r) {
int mid = l + ((r - l) >> 1);
if (k <= array[mid]) {
r = mid - 1;
} else {
l = mid + 1;
}
}
if (l < array.length && array[l] == k) {
return l;
} else {
return -1;
}
}
private int getLast(int[] array, int k) {
int l = 0;
int r = array.length - 1;
while (l <= r) {
int mid = l + ((r - l) >> 1);
if (k >= array[mid]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
if (r >= 0 && array[r] == k) {
return r;
} else {
return -1;
}
}
}
构造 k+0.5 , k-0.5 :
public int GetNumberOfK2(int[] array, int k) {
if (array == null || array.length == 0) {
return 0;
}
return helper(array, k + 0.5) - helper(array, k - 0.5);
}
private int helper(int[] array, double k) {
int l = 0;
int r = array.length - 1;
while (l <= r) {
int mid = l + ((r - l) >> 1);
if (k < array[mid]) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return l; //也可以写成 return r;
}
本文介绍了一种高效算法,用于统计排序数组中特定数字的出现次数。通过两次二分查找,分别找到目标数字的首个和末位位置,进而计算其出现频率。此外,还提供了一种利用k+0.5和k-0.5构造辅助查找的方法。
268

被折叠的 条评论
为什么被折叠?



