博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《剑指 Offer》——37、数字在排序数组中出现的次数
阅读量:2343 次
发布时间:2019-05-10

本文共 1810 字,大约阅读时间需要 6 分钟。

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; }}

转载地址:http://rbjvb.baihongyu.com/

你可能感兴趣的文章
Copy_from&to_user详解
查看>>
【C++】六、继承与多态
查看>>
特征向量的欧式距离与余弦距离——推荐算法
查看>>
jQuery提示和技巧
查看>>
是否可以在Python中将长行分成多行[重复]
查看>>
你什么时候使用Builder模式? [关闭]
查看>>
在jQuery中每5秒调用一次函数的最简单方法是什么? [重复]
查看>>
Angular 2+中的ngShow和ngHide等效于什么?
查看>>
如何将Java String转换为byte []?
查看>>
@Transactional注释在哪里?
查看>>
找不到Gradle DSL方法:'runProguard'
查看>>
AngularJS ngClass条件
查看>>
为什么需要在脚本文件的开头加上#!/ bin / bash?
查看>>
ReactJS-每次调用“ setState”时都会调用渲染吗?
查看>>
ng-if和ng-show / ng-hide有什么区别
查看>>
用Java复制文件的标准简洁方法?
查看>>
管理webpack中的jQuery插件依赖项
查看>>
删除可能不存在的文件的大多数pythonic方式
查看>>
如何在Eclipse中为Java文本编辑器更改字体大小?
查看>>
我们应该@Override接口的方法实现吗?
查看>>