剑指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再排序数组中出现的次数. 二分查找法在数 ...
随机推荐
- js的常用场景效果
转自https://www.cnblogs.com/tangdiao/p/9481681.html 1.checkbox的使用场景,学习之后就是购物车页面的自动计算的上手示例. 做成给checkbox ...
- 某酒店建筑设计CAD施工图
本素材为某酒店建筑设计CAD施工图,其中包涵的有酒店室内装修图纸.各个标间房屋改造图以及酒店场外建筑施工图.其中图纸的格式都是为dwg格式的.想要查看图纸就可以使用CAD看图软件来进行查看.以下就是一 ...
- JS---DOM---点击操作---part1---20个案例
点击操作:------>事件: 就是一件事, 有触发和响应, 事件源 按钮被点击,弹出对话框 按钮---->事件源 点击---->事件名字 被点了--->触发了 弹框了---& ...
- Cocos2d-x3.0网络通信学习(一)
配置:win7+Cocos2d-x.3.0+VS2012 摘要:建立基本的http通信并得到返回信息. 一.添加项目与编译库 1.添加头文件 在需要用到Http网络相关类的文件中加入头文件 #incl ...
- STM32基本GPIO操作:点灯(库函数+寄存器)
社团作业=_= 开发版上的LED灯负极连接在PB5口,正极串联一510Ω电阻后与3.3V相连 若开发板不带LED灯则需要自行连接,务必串联一个合适的电阻防止LED灯烧坏 零.一个有趣的延时函数 来自于 ...
- 洛谷 SP263 Period
洛谷 SP263 Period 题目描述 For each prefix of a given string S* with N* characters (each character has an ...
- a minimum of subsistence
A hundred years ago it was assumed and scientifically "proved" by economists that the laws ...
- [译]Vulkan教程(32)生成mipmap
[译]Vulkan教程(32)生成mipmap Generating Mipmaps 生成mipmap Introduction 入门 Our program can now load and ren ...
- koa2 从入门到进阶之路 (六)
之前的文章我们介绍了一下 koa post提交数据及 koa-bodyparser中间件,本篇文章我们来看一下 koa-static静态资源中间件. 我们在之前的目录想引入外部的 js,css,img ...
- Gerrit常见命令及最佳实践
概述 本文记录了笔者在使用Gerrit(一种免费.开放源代码的代码审查软件)过程中的一些微小的经验,在这里做个简单的分享. 克隆工程 git clone ssh://tusi@xx.xx.cn:294 ...