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. 解决Js跨域访问的问题

    1,最近有个需求,用Js获取Html标签<input type="file"/>的路径!遇到代码拒绝访问,提示安全验证,不允许跨域访问,简单的设置一下浏览器即可,不过对 ...

  2. 【.net开发者自学java系列】使用Eclipse开发SpringMVC(2)

    大概熟悉了 Eclipse. 然后先上Spring MVC 官网看看. 可是英文太差?翻译咯.现在翻译可屌了,真高兴生活在现在科技发达的时代.活着在中国太美好了. 没出过国门就能看懂英文.我都崇拜自己 ...

  3. Oracle 统计信息

    Oracle数据库中的统计信息是这样一组数据:它存储在数据字典中,且从多个维度描述了Oracle数据库里对象的详细信息. CBO会利用这些统计信息来计算目标SQL各种可能的,不同的执行路径的成本,从中 ...

  4. iOS原生分享功能

    iOS_系统原生分享 - CSDN博客 通过UIActivityViewController实现更多分享服务 - 简书 UIActivity - UIKit _ Apple Developer Doc ...

  5. 解决mysql远程登录

    MySQL不允许远程登录,所以远程登录失败了,解决方法如下: 在装有MySQL的机器上登录MySQL mysql -u root -p密码 执行use mysql; 执行update user set ...

  6. JQuery中事件冒泡

    JQuery中事件冒泡 定义 在一个对象上触发某类事件,就会执行此事件程序,如果没有处理事件就会向这个对象的父级对象传播 直至它被处理,最顶层老大为document对象. 作用 事件冒泡允许多个操作被 ...

  7. linux-2.6.22.6内核启动分析之编译体验

    1 解压缩.打补丁操作 1.1 打开ubuntu,通过FTP将windows相应文件夹下的linux-2.6.22.6.tar.bz2和补丁文件linux-2.6.22.6-jz2440.patch上 ...

  8. 从零开始的Python学习Episode 14——日志操作

    日志操作 一.logging模块 %(message)s 日志信息 %(levelno)s 日志级别 datefmt 设置时间格式 filename 设置日志保存的路径 level 设置日志记录的级别 ...

  9. python七类之集合

    集合 一.关键字 : set 定义是 s = {}    #当里面没有元素的时候​​表现为字典数据类型 s = {} #空的{}代表空的字典,而不是集合 print(type(s)) 集合是不可哈希的 ...

  10. 单线程+多线程下载doutula.com图片

    现在是2018年8月11日11:26:42,我挖的eth又降价了..... 单线程 # -*- coding:utf-8 -*- import re import os import urllib i ...