Nowcoder java-数字在排序数组中出现的次数
(题目来自牛客网)
思路
由于数组有序,所以使用二分查找方法定位k的第一次出现位置和最后一次出现位置
获取k第一次出现的下标
获取k最后一次出现的下标
时间复杂度O(logn)
代码
public class GetNumberOfK {
public static int getNumberOfK(int[] array, int k) {
//由于数组有序,所以使用二分查找方法定位k的第一次出现位置和最后一次出现位置
//获取k第一次出现的下标
//获取k最后一次出现的下标
if (array == null || array.length == 0) {
return 0;
}
int first = getFirstK(array, k, 0, array.length - 1);
int last = getLastK(array, k, 0, array.length - 1);
if (first == -1 || last == -1) {
return 0;
} else {
return last - first + 1;
}
}
public static int getFirstK(int[] array, int k, int low, int high) {
if (low > high) {
return -1;
}
int mid = 0;
mid = (low + high) / 2;
if (array[mid] == k) {
if (mid > 0 && array[mid - 1] != k || mid == 0) {
return mid;
} else {
high = mid - 1;
}
} else if (array[mid] < k) {
low = mid + 1;
} else {
high = mid - 1;
}
return getFirstK(array, k, low, high);
}
public static int getLastK(int[] array, int k, int low, int high) {
if (low > high) {
return -1;
}
int mid = 0;
mid = (low + high) / 2;
if (array[mid] == k) {
if (mid <array.length -1 && array[mid + 1] != k || mid == array.length -1) {
return mid;
} else {
low = mid + 1;
}
} else if (array[mid] < k) {
low = mid + 1;
} else {
high = mid - 1;
}
return getLastK(array, k, low, high);
}
}