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


# 题目

# 思路

利用二分查找法,查找元素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. Matrix_QP(A_2SeqSum)

    hdu_4686 题目大意:给出an,bn的递推,求ai*bi(i=0,1,--n-1)的和(an=a(n-1)*Ax+Ay, bn=b(n-1)*Bx+By, a0=A0, b0=B0, Ax,Bx ...

  2. 回文树 Palindromic Tree

    回文树 Palindromic Tree 嗯..回文树是个什么东西呢. 回文树(或者说是回文自动机)每个节点代表一个本质不同的回文串. 首先它类似字典树,每个节点有SIGMA个儿子,表示对应的字母. ...

  3. 03_zookeeper伪集群安装

    一句话说明白:在1台机器上模拟多台机器,对外提供服务 在理解zookeeper集群安装方法的基础上,本文描述如何将1个机器模拟为3个节点的zookeeper集群,建议先参考阅读本文的前一期 zooke ...

  4. eclipse及tomcat web站點

    eclipse环境下如何配置tomcat https://www.cnblogs.com/Leo_wl/p/4769760.htmleclipse环境下如何配置tomcat,并且把项目部署到Tomca ...

  5. bzoj 1270: [BeijingWc2008]雷涛的小猫 简单dp+滚动数组

    1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Descrip ...

  6. 全文检索引擎Solr系列——整合中文分词组件mmseg4j

    默认Solr提供的分词组件对中文的支持是不友好的,比如:“VIM比作是编辑器之神”这个句子在索引的的时候,选择FieldType为”text_general”作为分词依据时,分词效果是: 它把每一个词 ...

  7. Centos 查看端口占用情况

    netstat -ntlp 把相应PID kill掉即可

  8. git-----初始化配置添加用户名和密码

    Git是分布式版本控制系统,GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心. 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实 ...

  9. docker远程仓库镜像推送到本地仓库

    #!/bin/bashimageid=(`docker images |grep -v REPOSITORY|awk '{print $3}'`)image=(`docker images |grep ...

  10. linux命令生成公私钥

    生成原始rsa私钥文件: openssl genrsa -out rsa_private_key.pem 1024 将原始的rsa私钥转换未pkcs8格式(即生成私钥文件): openssl pkcs ...