题目:

统计一个数字在排序数组中出现的次数。

分析:

给定一个已经排好序的数组,统计一个数字在数组中出现的次数。

那么最先想到的可以遍历数组统计出现的次数,不过题目给了排序数组,那么一定是利用了排序这个性质来缩减时间复杂度的。

因为如果所给的数字在数组中出现,那么这个数字在数组中一定是连续的,那么可以利用二分查找所给出的数字的首尾索引。

程序:

C++

class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.size() == ){
return ;
}
int l = FindFirst(data, k, , data.size()-);
int r = FindEnd(data, k, , data.size()-);
if(r != - && l != -)
return r-l+;
else
return ;
}
int FindFirst(vector<int> &data ,int k, int left, int right){
if(left > right)
return -;
int mid = left + (right - left) / ;
if(data[mid] == k){
if((mid > && data[mid-] != k) || mid == )
return mid;
else
right = mid - ;
}
else if(data[mid] < k){
left = mid + ;
}
else{
right = mid -;
}
return FindFirst(data, k, left, right);
}
int FindEnd(vector<int> &data ,int k, int left, int right){
if(left > right)
return -;
int mid = left + (right - left) / ;
if(data[mid] == k){
if((mid < data.size()- && data[mid+] != k) || mid == data.size()-)
return mid;
else
left = mid + ;
}
else if(data[mid] < k){
left = mid + ;
}
else{
right = mid -;
}
return FindEnd(data, k, left, right);
}
};

Java

public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length == 0){
return 0;
}
int l = FindFirst(array, k, 0, array.length-1);
int r = FindEnd(array, k, 0, array.length-1);
if(r != -1 && l != -1)
return r-l+1;
else
return 0;
}
int FindFirst(int [] array ,int k, int left, int right){
if(left > right)
return -1;
int mid = left + (right - left) / 2;
if(array[mid] == k){
if((mid > 0 && array[mid-1] != k) || mid == 0)
return mid;
else
right = mid - 1;
}
else if(array[mid] < k){
left = mid + 1;
}
else{
right = mid -1;
}
return FindFirst(array, k, left, right);
}
int FindEnd(int [] array ,int k, int left, int right){
if(left > right)
return -1;
int mid = left + (right - left) / 2;
if(array[mid] == k){
if((mid < array.length-1 && array[mid+1] != k) || mid == array.length-1)
return mid;
else
left = mid + 1;
}
else if(array[mid] < k){
left = mid + 1;
}
else{
right = mid -1;
}
return FindEnd(array, k, left, right);
}
}

剑指Offer-36.数字在排序数组中出现的次数(C++/Java)的更多相关文章

  1. 【剑指Offer】数字在排序数组中出现的次数 解题报告(Python)

    [剑指Offer]数字在排序数组中出现的次数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...

  2. 【Java】 剑指offer(53-1) 数字在排序数组中出现的次数

    正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 统计一个数字在排序数组中出现的次数.例如输入排序数组{1, ...

  3. Go语言实现:【剑指offer】数字在排序数组中出现的次数

    该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...

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

    2013-09-02 16:28:35 找出数字在排序数组中出现的次数. 注意几点: 一开始试图用size_t类型表示数组的下标begin.end,到那时这样做在end = 0时,end - 1是si ...

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

    题目描述 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5} 和数字3,输出4. 思路如下 1. 预估时间复杂度,最复杂情况是,顺序扫描,统计K出现的次数,时间复杂 ...

  6. 剑指Offer 37. 数字在排序数组中出现的次数 (数组)

    题目描述 统计一个数字在排序数组中出现的次数. 题目地址 https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId ...

  7. 《剑指offer》-数字在排序数组中出现的次数

    统计一个数字在排序数组中出现的次数. 首先吐槽下出题人的用词,啥叫排序数组?"排序"是个动词好么,"有序"作为一个形容词表示状态,修饰"数组" ...

  8. [剑指Offer] 37.数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. [思路]因为是排序数组,所以可以用二分法搜索到要查找的值在数组中的一个位置,接着向两侧扫描,遇到不等的就停止. class Solution { pub ...

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

    题目描述: 统计一个数字在排序数组中出现的次数. 思路分析: 1. 直观思路是直接遍历一遍,统计.复杂度也只要O(n). 2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成.分别二分查 ...

  10. 【剑指offer】数字在排序数组中出现的次数,C++实现

    原创博文,转载请注明出处! # 题目 # 思路 利用二分查找法,查找元素k在排序数组中第一次出现的位置m及最后一次出现的位置n,m-n+1即为元素k再排序数组中出现的次数.       二分查找法在数 ...

随机推荐

  1. JavaWeb学习——Servlet相关的接口和类

    JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...

  2. 龙芯(mips64)电脑安装NodeJS

    背景 龙芯是国产的cpu,采用是mips架构,就类似大家熟知的x86.arm. 最近在一台龙芯电脑(系统是中兴新支点,Linux)上调试前端应用(electron),于是就需要安装NodeJS. 但是 ...

  3. css position:sticky的尝试

    前言 sticky这种设计效果是经常出现的,比如陶宝右侧的工具栏,当我们向下滚动到它的位置时,它就会黏住顶部跟随滚动,类似position: fixed的效果,只不过它的触发条件是当我们滚动到所在位置 ...

  4. Android 下载进度对话框 ProgressDialog

    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...

  5. source insight 3 常用设置

    总结了一些source insight的一些常用设置,这些设置需求因人而异,自己用的顺手的才是最好的. 1.括号配对高亮“在前括号左侧,后括号左侧”双击鼠标左键,可以选定匹配括号和其中内容(<& ...

  6. 分组排序函数——row_number()

    1.MySQL8.0以上版本 用法1:无分组排序 Row_number() OVER(ORDER BY 字段 DESC)例如:Row_number() OVER(ORDER BY 学生成绩 DESC) ...

  7. 关于thymeleaf中th:if的使用

    运用于判断表达式中时,关系判断使用 gt / ge / eq / lt / le / ne (即:使用缩写) gt: great than(大于)> ge: great equal(大于等于)& ...

  8. 25.推荐---协同过滤(Collaborative Filtering)

    协同过滤需要注意的三点: gray sheep(有人喜欢追求特别,协同过滤一般只能从共同的人或物间找相似) shilling attack(水军刷好评导致数据错误,无法带来精确的推荐) cold st ...

  9. C# 中代码执行 ping 操作

    在代码中可以通过调用 System.Net.NetworkInformation 命名控件下的 Ping 类的 Send() 方法来实现,代码如下: var ping = new System.Net ...

  10. JS表单内容垂直循环滚动

    参考博客:https://blog.csdn.net/yubo_725/article/details/52839493  大佬是真的厉害,保存一下,以方便后续使用 效果: 源码: <!DOCT ...