原创博文,转载请注明出处!


# 题目

# 思路

利用二分查找法,查找元素k在排序数组中第一次出现的位置m及最后一次出现的位置n,m-n+1即为元素k再排序数组中出现的次数。

      二分查找法在数组中找到第一个k的思路:先拿数组中间元素mid和查找元素k比较,如果k<mid,则第一个k只可能出现在数组的前半段;如果k>mid,则第一个k只可能出现在数组的后半段;如果k=mid,则先判断中间元素是不是第一个k(如果mid前的元素不是k,则中间元素是第一个k;如果mid前的元素是k,则第一个k出现在数组的前半段。

二分查找法在数组中找到最后一个k的思路:先拿数组中间元素mid和查找元素k比较,如果k<mid,则最后一个元素k只可能出现在数组的前半段;如果k>mid,则最后一个元素k只可能出现在数组的后半段;如果k=mid,则先判断中间元素是不是最后一个k(如果mid后的元素不是k,则中间元素是最后一个k;如果mid后的元素是k,则最后一个k出现在数组的后半段。

# 代码

  1 #include <iostream>
2 #include <vector>
3 using namespace std;
4
5 class Solution {
6 public:
7 // 查找元素k在有序数组中出现的次数
8 int GetNumberOfK(vector<int> data ,int k)
9 {
10 // 特殊输入
11 if(data.size() == 0)
12 return 0;
13 cout<<data.size()<<endl;
14
15 // 在有序数组中查找k第一次出现的位置
16 int first = GetFirstK(data,k,0,data.size()-1);
17 cout<<first<<endl;
18
19 // 在有序数组中查找k最后一次出现的位置
20 int last = GetLastK(data,k,0,data.size()-1);
21 cout<<last<<endl;
22
23 // 计算次数
24 if(first != -1 && last != -1)
25 return last-first+1;
26
27 // 未找到元素
28 return 0;
29 }
30
31 // 二分查找法,查找第一个k的位置
32 int GetFirstK(vector<int> data,int k,int l,int r)
33 {
34 // 递归出口
35 if(l>r)
36 return -1;
37
38 int mid = (l+r)>>1;
39
40 if(k<data[mid])
41 {
42 r = mid-1;
43 }
44 else if (k>data[mid])
45 {
46 l = mid+1;
47 }
48 else
49 {
50 if((mid>0 && data[mid-1] != k) || mid == 0)
51 return mid;
52 else
53 r = mid-1;
54 }
55 return GetFirstK(data,k,l,r);
56 }
57
58 // 二分查找法,查找最后一个k的位置
59 int GetLastK(vector<int> data,int k,int l,int r)
60 {
61 if(l>r)
62 return -1;
63
64 int mid = (l+r)>>1;
65
66 if(k<data[mid])
67 r = mid-1;
68 else if(k>data[mid])
69 l = mid+1;
70 else
71 {
72 if((mid < data.size()-1 && data[mid+1]!=k) || mid == data.size()-1)
73 return mid;
74 else
75 l = mid+1;
76 }
77 return GetLastK(data,k,l,r);
78 }
79 };
80 int main()
81 {
82 cout << "二分查找法计算数字k在排序数组中出现的次数" << endl;
83 // 空数组
84 vector<int> arr1;
85 // 数组中不包含查找的数字
86 vector<int> arr2 = {1,3,5,7,9,10};
87 // 数组中包含查找的数组(出现一次)
88 vector<int> arr3 = {1,2,2,2,2,3,3,3,4,5};
89 // 数组中包含查找的数组(出现多次)
90 vector<int> arr4 = {1,2,3,4,4,4,7,8,9,10};
91 Solution solution;
92 cout<<solution.GetNumberOfK(arr1,4)<<endl;
93
94 return 10086;
95 }
96

【剑指offer】数字在排序数组中出现的次数,C++实现的更多相关文章

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

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

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

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

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

    1. 题目 2. 解答 时间复杂度为 \(O(n)\) 的算法,顺序遍历数组,当该数字第一次出现时开始记录次数. class Solution { public: int GetNumberOfK(v ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Oracle SQL Developer 编辑区不能删除,后退,空格,复制粘贴等功能都失效的解决办法

    Oracle SQL Developer 编辑区不能删除,后退,空格,复制粘贴等功能都失效的解决办法 解决: 打开菜单并选择Tools-prefrence-Accelerators-Load Pres ...

  2. Protocol Buffers数据传输及存储协议简单使用

    我们知道Protocol Buffers是Google定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据 ...

  3. 09_MySQL DQL_SQL99标准中的多表查询(外连接)

    # 二.外连接/* 场景:查询值在1个表中出现,在另外1个表中没有出现 特点: 0.也是两张表的字段拼接,分为主表和从表 1.外连接的结果,将显示主表中的所有记录行 如果连接字段在从表中有记录,则显示 ...

  4. Linux系统非root用户安装perl模块

    非root权限安装perl 在使用Linux或是unix时,perl是一个非常有用的脚本的语言. 关于perl的模块安装,网上也有很多介绍,一方面可以通过不同套件自带的软件安装工具安装,一方面可以通过 ...

  5. HTML 参考手册- (HTML5 标准)

    HTML 参考手册- (HTML5 标准) 功能排序 New : HTML5 新标签 标签 描述 基础   <!DOCTYPE>  定义文档类型. <html> 定义一个 HT ...

  6. Android--------工具类StatusBarUtil实现完美状态栏

    很早就想写这篇博客了,直到前几天有人问我这方面的问题才想起. 沉浸式状态栏是从android Kitkat(Android 4.4)开始出现的,顶部状态栏的颜色可以根据开发需求改变,使得APP风格更加 ...

  7. Lua学习笔记2. lua变量和 循环

    1. lua中变量的作用域有三种:全局,局部,表中的域 需要注意的是默认的变量都是全局变量,必须声明为local的变量才是局部变量,即使是在函数里面没有使用local修饰的变量依然是全局变量!!!! ...

  8. Mac下新安装的MySQL无法登陆root用户解决方法

      一 设置MySQL命令行搜索路径 0.苹果->系统偏好设置->最下边点mysql 在弹出页面中 启动mysql服务 1.打开终端,输入: sudo vi ~/.bash_profile ...

  9. Find the odd int

    Given an array, find the int that appears an odd number of times. There will always be only one inte ...

  10. jps、jstack、jmap、jhat、jstat、hprof使用详解

    https://my.oschina.net/feichexia/blog/196575#comment-list A. jps(Java Virtual Machine Process Status ...