剑指Offer-36.数字在排序数组中出现的次数(C++/Java)
题目:
统计一个数字在排序数组中出现的次数。
分析:
给定一个已经排好序的数组,统计一个数字在数组中出现的次数。
那么最先想到的可以遍历数组统计出现的次数,不过题目给了排序数组,那么一定是利用了排序这个性质来缩减时间复杂度的。
因为如果所给的数字在数组中出现,那么这个数字在数组中一定是连续的,那么可以利用二分查找所给出的数字的首尾索引。
程序:
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)的更多相关文章
- 【剑指Offer】数字在排序数组中出现的次数 解题报告(Python)
[剑指Offer]数字在排序数组中出现的次数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...
- 【Java】 剑指offer(53-1) 数字在排序数组中出现的次数
正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 统计一个数字在排序数组中出现的次数.例如输入排序数组{1, ...
- Go语言实现:【剑指offer】数字在排序数组中出现的次数
该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...
- 【剑指offer】数字在排序数组中出现的次数
2013-09-02 16:28:35 找出数字在排序数组中出现的次数. 注意几点: 一开始试图用size_t类型表示数组的下标begin.end,到那时这样做在end = 0时,end - 1是si ...
- 剑指offer: 38 数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5} 和数字3,输出4. 思路如下 1. 预估时间复杂度,最复杂情况是,顺序扫描,统计K出现的次数,时间复杂 ...
- 剑指Offer 37. 数字在排序数组中出现的次数 (数组)
题目描述 统计一个数字在排序数组中出现的次数. 题目地址 https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId ...
- 《剑指offer》-数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数. 首先吐槽下出题人的用词,啥叫排序数组?"排序"是个动词好么,"有序"作为一个形容词表示状态,修饰"数组" ...
- [剑指Offer] 37.数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数. [思路]因为是排序数组,所以可以用二分法搜索到要查找的值在数组中的一个位置,接着向两侧扫描,遇到不等的就停止. class Solution { pub ...
- 剑指offer:数字在排序数组中出现的次数
题目描述: 统计一个数字在排序数组中出现的次数. 思路分析: 1. 直观思路是直接遍历一遍,统计.复杂度也只要O(n). 2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成.分别二分查 ...
- 【剑指offer】数字在排序数组中出现的次数,C++实现
原创博文,转载请注明出处! # 题目 # 思路 利用二分查找法,查找元素k在排序数组中第一次出现的位置m及最后一次出现的位置n,m-n+1即为元素k再排序数组中出现的次数. 二分查找法在数 ...
随机推荐
- JavaWeb学习——Servlet相关的接口和类
JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...
- 龙芯(mips64)电脑安装NodeJS
背景 龙芯是国产的cpu,采用是mips架构,就类似大家熟知的x86.arm. 最近在一台龙芯电脑(系统是中兴新支点,Linux)上调试前端应用(electron),于是就需要安装NodeJS. 但是 ...
- css position:sticky的尝试
前言 sticky这种设计效果是经常出现的,比如陶宝右侧的工具栏,当我们向下滚动到它的位置时,它就会黏住顶部跟随滚动,类似position: fixed的效果,只不过它的触发条件是当我们滚动到所在位置 ...
- Android 下载进度对话框 ProgressDialog
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV ...
- source insight 3 常用设置
总结了一些source insight的一些常用设置,这些设置需求因人而异,自己用的顺手的才是最好的. 1.括号配对高亮“在前括号左侧,后括号左侧”双击鼠标左键,可以选定匹配括号和其中内容(<& ...
- 分组排序函数——row_number()
1.MySQL8.0以上版本 用法1:无分组排序 Row_number() OVER(ORDER BY 字段 DESC)例如:Row_number() OVER(ORDER BY 学生成绩 DESC) ...
- 关于thymeleaf中th:if的使用
运用于判断表达式中时,关系判断使用 gt / ge / eq / lt / le / ne (即:使用缩写) gt: great than(大于)> ge: great equal(大于等于)& ...
- 25.推荐---协同过滤(Collaborative Filtering)
协同过滤需要注意的三点: gray sheep(有人喜欢追求特别,协同过滤一般只能从共同的人或物间找相似) shilling attack(水军刷好评导致数据错误,无法带来精确的推荐) cold st ...
- C# 中代码执行 ping 操作
在代码中可以通过调用 System.Net.NetworkInformation 命名控件下的 Ping 类的 Send() 方法来实现,代码如下: var ping = new System.Net ...
- JS表单内容垂直循环滚动
参考博客:https://blog.csdn.net/yubo_725/article/details/52839493 大佬是真的厉害,保存一下,以方便后续使用 效果: 源码: <!DOCT ...