题目描述
题目一:数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。
例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了四次,因此输出4.
练习地址
实现
看见有序,肯定就是二分查找了,算法比较简单。
//时间复杂度O(logn)
public class C53_array_GetK {
public static int getNumberOfK(int[] arr, int k) {
if (arr == null || arr.length == 0) {
return 0;
}
int count = 0;
int p1 = getFirstK(arr, k, 0, arr.length - 1);
int p2 = getLastK(arr, k, 0, arr.length - 1);
if (p1 > -1 && p2 > -1) {
count = p2 - p1 + 1;
}
return count;
}
// 二分法获取第一个k的下标
static int getFirstK(int[] arr, int k, int start, int end) {
if (start > end) return -1;
int mid = (start + end) / 2;
int midElem = arr[mid];
if (midElem == k) {
if ((mid > 0 && arr[mid - 1] != k) || mid == 0) {
return mid;
} else {
end = mid - 1;
}
} else if (midElem > k) {
end = mid - 1;
} else {
start = mid + 1;
}
return getFirstK(arr, k, start, end);
}
//二分法获取二个k的下标
static int getLastK(int[] arr, int k, int start, int end) {
if (start > end) {
return -1;
}
int mid = (start + end) / 2;
int midElem = arr[mid];
if (midElem == k) {
if ((mid < arr.length - 1 && arr[mid + 1] != k) || mid == arr.length - 1) {
return mid;
} else {
start = mid + 1;
}
} else if (midElem < k) {
start = mid + 1;
} else {
end = mid - 1;
}
return getLastK(arr, k, start, end);
}
}
Test
public static void main(String[] args) {
int[] arr={1,2,3,3,3,3,4,5};
System.out.println(getNumberOfK(arr, 3));
}