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——数字在排序数组中出现的次数的更多相关文章

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

    题目描述: 统计一个数字在排序数组中出现的次数. 分析: 二分变形.二分查找最左边和最右边k的位置,然后相减加一就是结果. 代码: class Solution { public: int GetNu ...

  2. 用java刷剑指offer(数字在排序数组中出现的次数)

    题目描述 统计一个数字在排序数组中出现的次数. 牛客网链接 java代码 //看见有序就用二分法 public class Solution { public int GetNumberOfK(int ...

  3. 剑指offer 数字在排序数组中出现的次数

    因为有序 所以用二分法,分别找到第一个k和最后一个k的下标.时间O(logN) class Solution { public: int GetNumberOfK(vector<int> ...

  4. 剑指offer--34.数字在排序数组中出现的次数

    时间限制:1秒 空间限制:32768K 热度指数:209611 本题知识点: 数组 题目描述 统计一个数字在排序数组中出现的次数. class Solution { public: int GetNu ...

  5. 剑指Offer-36.数字在排序数组中出现的次数(C++/Java)

    题目: 统计一个数字在排序数组中出现的次数. 分析: 给定一个已经排好序的数组,统计一个数字在数组中出现的次数. 那么最先想到的可以遍历数组统计出现的次数,不过题目给了排序数组,那么一定是利用了排序这 ...

  6. 剑指Offer36 数字在排序数组中出现的次数

    /************************************************************************* > File Name: 36_Number ...

  7. 剑指offer38 数字在排序数组中出现的次数

    这种方法没用迭代,而是使用了循环的方式 class Solution { public: int GetNumberOfK(vector<int> data ,int k) { if(da ...

  8. 剑指offer——56在排序数组中查找数字

    题目描述 统计一个数字在排序数组中出现的次数.   题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N) ...

  9. 剑指offer-数字在排序数组中出现的次数-数组-python

    题目描述 统计一个数字在排序数组中出现的次数.   python 内置函数 count()一行就能搞定   解题思路 二分查找到给定的数字及其坐标.以该坐标为中点,向前向后找到这个数字的 始 – 终 ...

随机推荐

  1. 维度属性的KeyColumns如果是Integer类型,那么维度表中该列的值不能有为null的

    如果维度属性的 KeyColumns的DataType设置为了Integer类型,那么要注意该维度属性列在数据库中不能有为null的值. 例如下图中我们有维度DIM_Vehcile,其中有个维度属性叫 ...

  2. Project Euler:Problem 86 Cuboid route

    A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, sits in the o ...

  3. java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml'

    java.lang.IllegalStateException: Failed to load property source from location 'classpath:/applicatio ...

  4. MySQL高级函数case的使用技巧----与sum结合实现分段统计

    case 函数 CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... WHEN conditionN THEN resu ...

  5. Java使用JodaTime处理时间

    简介 在Java中处理日期和时间是很常见的需求,基础的工具类就是我们熟悉的Date和Calendar,然而这些工具类的api使用并不是很方便和强大,于是就诞生了Joda-Time这个专门处理日期时间的 ...

  6. 学习tp5的第三天(模型)

    一.模型 1.定义基础模型 <?php namespace app\index\model; use think\Model; class User extends Model{ // 设置完整 ...

  7. 3.Hadoop测试Yarn和MapReduce

    Hadoop测试Yarn和MapReduce 1.配置Yarn (1)配置ResourceManager 生产环境中,一般是重开一台机器作为ResourceManager,这里我们以Master机器代 ...

  8. python从Excel中提取邮箱

    从各个城市的律师协会去爬取的律师的招聘信息,可是邮箱在招聘简介里面,所有需要写个脚本去提取邮箱 import pandas as pd import re regex = r"([-_a-z ...

  9. RandomAccessFile java

    RandomAccessFile 用来支持读写随机存取文件的类.提供“文件指针”,类似于游标和下标,使用getFilePointer()方法获得,利用seek()方法设置下标. public Rand ...

  10. 为树莓派添加一个强实时性前端[原创cnblogs.com/helesheng]

    树莓派是最近流行嵌入式平台,其自由的开源特性以及低廉的价格,吸引了来 自全球的大量极客和计算机大咖的关注.来自各大树莓派社区的幕后英雄,无私地在这个开源硬件平台上做了大量的工作,将其打造成了世界上通用 ...