题目描述
// 53. 数字在排序数组中出现的次数
// 力扣
// 统计一个数字在排序数组中出现的次数。
// 牛客
// 统计一个数字在升序数组中出现的次数。
题解
// 二分查找
// 牛客
// 二分查找法,构建二分查找函数binarysearch,
// binarysearch函数,输入arr和k,通过二分查找方法找到k数字(的重复集),
// 并返回k数字(的重复集)末端的下一位索引。
// 具体情况:arr首端索引left,arr末端索引right,对半找中点索引
// mid = (left + right) / 2,如果中点索引arr[mid]不大于目标k,则
// left更新到mid的下一位索引mid+1,如此循环,直到left到达第一个大于
// k的元素的索引。
//
// 主函数GetNumberOfK则调用两次binarysearch,第一次调用binarysearch(array, k)
// 找k之后第一个大于k的元素(第一次调用找到k重复集的length索引)。
// 第二次调用binarysearch(array, k - 1)找k-1之后第一个大于k-1的元素(就是k),
// (第二次调用找到k重复集的0索引),两个返回值相减,就是k的出现次数(k
// 重复集的长度)
// 运行时间:11ms,超过84.49%用Java提交的代码
// 占用内存:9608KB,超过5.82%用Java提交的代码
public class Solution {
public int GetNumberOfK(int[] array , int k) {
return binarysearch(array, k) - binarysearch(array, k - 1);
}
public int binarysearch(int[] arr, int k) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] <= k) {
left = mid + 1;
}
else { // k < arr[mid]
right = mid - 1;
}
}
return left;
}
}
// 力扣
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:41.3 MB, 在所有 Java 提交中击败了70.38%的用户
class Solution {
public int search(int[] nums, int target) {
return binarysearch(nums, target) - binarysearch(nums ,target - 1);
}
public int binarysearch(int[] arr, int target) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] <= target)
left = mid + 1;
else // target < arr[mid]
right = mid - 1;
}
return left;
}
}