剑指 Offer——数字在排序数组中出现的次数
1. 题目

2. 解答
时间复杂度为 \(O(n)\) 的算法,顺序遍历数组,当该数字第一次出现时开始记录次数。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int n = data.size();
if (n == 0) return 0;
int num = 0;
for (int i = 0; i < n; i++)
{
if (data[i] == k)
{
num = 1;
while (i + 1 < n && data[i+1] == k)
{
num++;
i++;
}
break;
}
}
return num;
}
};
时间复杂度为 \(O(logn)\) 的算法,借助二分查找,分别查找该数字第一次在数组中出现的位置和最后一次在数组中出现的位置,然后即可得到 出现的次数。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int n = data.size();
if (n == 0) return 0;
int num = 0;
int i = Find_First_K(data, k);
int j = Find_Last_K(data, k);
num = (i == -1) ? 0 : (j - i + 1);
return num;
}
int Find_First_K(vector<int> &data, int k)
{
int left = 0;
int right = data.size() - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (data[mid] == k)
{
// 到数组头了或者前一个元素不为 k
if (mid == 0 || data[mid-1] != k) return mid;
else right = mid - 1;
}
else if (data[mid] > k) right = mid - 1;
else left = mid + 1;
}
return -1;
}
int Find_Last_K(vector<int> &data, int k)
{
int left = 0;
int right = data.size() - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (data[mid] == k)
{
// 到数组尾了或者后一个元素不为 k
if (mid == data.size() - 1 || data[mid+1] != k) return mid;
else left = mid + 1;
}
else if (data[mid] > k) right = mid - 1;
else left = mid + 1;
}
return -1;
}
};
获取更多精彩,请关注「seniusen」!

剑指 Offer——数字在排序数组中出现的次数的更多相关文章
- 剑指Offer——数字在排序数组中出现的次数
题目描述: 统计一个数字在排序数组中出现的次数. 分析: 二分变形.二分查找最左边和最右边k的位置,然后相减加一就是结果. 代码: class Solution { public: int GetNu ...
- 用java刷剑指offer(数字在排序数组中出现的次数)
题目描述 统计一个数字在排序数组中出现的次数. 牛客网链接 java代码 //看见有序就用二分法 public class Solution { public int GetNumberOfK(int ...
- 剑指offer 数字在排序数组中出现的次数
因为有序 所以用二分法,分别找到第一个k和最后一个k的下标.时间O(logN) class Solution { public: int GetNumberOfK(vector<int> ...
- 剑指offer--34.数字在排序数组中出现的次数
时间限制:1秒 空间限制:32768K 热度指数:209611 本题知识点: 数组 题目描述 统计一个数字在排序数组中出现的次数. class Solution { public: int GetNu ...
- 剑指Offer-36.数字在排序数组中出现的次数(C++/Java)
题目: 统计一个数字在排序数组中出现的次数. 分析: 给定一个已经排好序的数组,统计一个数字在数组中出现的次数. 那么最先想到的可以遍历数组统计出现的次数,不过题目给了排序数组,那么一定是利用了排序这 ...
- 剑指Offer36 数字在排序数组中出现的次数
/************************************************************************* > File Name: 36_Number ...
- 剑指offer38 数字在排序数组中出现的次数
这种方法没用迭代,而是使用了循环的方式 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { if(da ...
- 剑指offer——56在排序数组中查找数字
题目描述 统计一个数字在排序数组中出现的次数. 题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N) ...
- 剑指offer-数字在排序数组中出现的次数-数组-python
题目描述 统计一个数字在排序数组中出现的次数. python 内置函数 count()一行就能搞定 解题思路 二分查找到给定的数字及其坐标.以该坐标为中点,向前向后找到这个数字的 始 – 终 ...
随机推荐
- gem install redis安装时报错:redis requires Ruby version >= 2.2.2
Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2 解决办法是 先安装rvm,再把ruby版本提升至2.3.3 1.安装curl sudo yum install ...
- Python装饰器高级用法
在Python中,装饰器一般用来修饰函数,实现公共功能,达到代码复用的目的.在函数定义前加上@xxxx,然后函数就注入了某些行为,很神奇!然而,这只是语法糖而已. 场景 假设,有一些工作函数,用来对数 ...
- Selenium报错整理
1. driver不匹配(常见于打不开浏览器,或者浏览器能打开但是获取不了网页元素,或者无法sendKey等问题) Exception in thread "main" org.o ...
- java web 常识
model.addattribute()的作用: 1.往前台传数据可以传对象,List,通过el表达式${}获取,类似于request.setAttribute("sts",sts ...
- Scala相关笔记
一.Scala概述以及安装 1. 什么是Scala Scala 是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行于 Java 平台(Java 虚拟机 ...
- Navicat 12 连接 Mysql8.0 使用日志
目前最新的Mysql8.0 + Navicat12,使用中常有一些棘手问题 解决了的都会贴出来,受益于小伙伴们 我们的目标是发现问题,解决问题,欢迎大家贴出自己使用时遇到的问题,集思广益 好了,上干货 ...
- C语言写的2048小游戏
基于"基于C_语言的2048算法设计_颜冠鹏.pdf" 这一篇文献提供的思路 在中国知网上能找到 就不贴具体内容了 [摘 要] 针对2048的游戏规则,分析了该游戏的算法特点,对其 ...
- Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.
最近在开发一个网站时,有个需要是 如果有新预警信息要在网页中播放提示音.页面打开会请求是否有新信息,有则播放提示音.在Chrome的最新浏览器中,播放会报错,控制台显示Uncaught (in pro ...
- PHP程序员的技术成长规划 第一阶段:基础阶段
第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟练(核心是安装配置基本操作)目标:能够完成基本的LNMP系统安装,简单配置维护:能够用PHP源码做基本的简单系统的PHP开发:能够在PHP中 ...
- 树莓派3B+学习笔记:7、挂载exfat格式U盘
树莓派的官方系统,默认不支持exfat格式U盘挂载. 插入exfat格式U盘会出现以下错误提示: 安装exfat-fuse后可以正常识别,需要在命令行执行以下命令,按“y”键回车确认: sudo ap ...