分析问题

问题只需要找到排序数组中某个数K的个数,由于已经是排序了,K一定是在一堆的,所以我们只需要找到第一个K的index1,然后找到最后一个K的index2就可以了

而寻找K的过程我们一般通过二分法查找,这样时间复杂度能降到logn

解决问题

我们通过二分法寻找k,如果中间的数小于k,那么在前半段找k;如果中间的数大于k,那么在后半段找k,那么如何判断找到的k是否是一堆k的边界呢

找第一个k的时候判断方式如下:

如果中间的数等于k,那么先判断前一个数是否存在,如果存在且等于k,在前半段找

如果存在不等于k或者不存在,那么这个数就是第一个k

找最后一个k的时候判断方式如下:

如果中间的数等于k,那么先判断后一个数是否存在,如果存在且等于k,在后半段找,如果存在不等于k或者不存在,那么这个数就是最后一个k

主要代码

int getLastK(int[] data,int length,int k,int start,int end){

if (start>end) {

return -1;

}

int midIndex=(start+end)/2;

int midData=data[midIndex];

if (data[midIndex]==k) {

if( (midIndex

return midIndex;

}else {

start=midIndex+1;

}

}else if (midData

start=midIndex+1;

}else {

end=midIndex-1;

}

return getLastK(data,length,k,start,end);

}

int getFirstK(int[] data,int length,int k,int start,int end){

if (start>end) {

return -1;

}

int midIndex=(start+end)/2;

int midData=data[midIndex];

if (data[midIndex]==k) {

if( (midIndex>0&&data[midIndex-1]!=k)||midIndex==0) {

return midIndex;

}else {

end=midIndex-1;

}

}else if (midData>k) {

end=midIndex-1;

}else {

start=midIndex+1;

}

return getFirstK(data,length,k,start,end);

}

int getNumOfK(int[] data,int length,int k){

int result = 0;

if (data!=null&&length>0) {

int first=getFirstK(data, length, k, 0, length-1);

int last=getLastK(data, length, k, 0, length-1);

System.out.println(first);

System.out.println(last);

if (first>-1&&last>-1) {

result=last-first+1;

}

}

return result;

}

java 数组中某个数出现的概率_剑指Offer解题报告(Java版)——排序数组中某个数的个数 38...相关推荐

  1. java计算筛子概率_剑指Offer解题报告(Java版)——n个骰子的点数 43

    问题 n个骰子朝上的数之和为s,求s的所有可能以及概率 分析问题 如果是用笨方法,一般人最开始都会想到笨方法,那就是枚举法 举个例子,比如两个骰子,第一个骰子的结果为1,2,3,4,5,6,两个骰子的 ...

  2. java统计一个字符串中每个字符出现的次数_剑指offer算法题054:字符流中第一个不重复的字符...

    推荐阅读:宇宙条的工作总结:一年前还在面试找工作,一年后在面试找工作的学弟学妹们:第一次当面试官的经历分享小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合 ...

  3. 统计数组中每个数字出现的次数_剑指Offer(二十八) 数组中次数出现超过一半的数字...

    题目描述 思路与解析 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长 ...

  4. java翻转单词顺序split_剑指offer解题报告(Java版)——翻转单词顺序 左旋字符串 42...

    引言 这种翻转的问题会遇到很多,其实就是一个倒序的问题,对于第一个题只是想翻转单词的顺序,而并不想把整个字符串翻转了,如果完全翻转的话,比如I am a student.中所有字符翻转得到.tnedu ...

  5. 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  6. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

  7. 在数组中查找指定元素_剑指 offer 第一题: 二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  8. 【牛客 - 剑指offer】JZ53 数字在升序数组中出现的次数 Java实现

    文章目录 剑指offer题解汇总 Java实现 本题链接 题目 方案一 暴力 方案二 二分(推荐) 剑指offer题解汇总 Java实现 https://blog.csdn.net/guligulig ...

  9. java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

最新文章

  1. 使用 Amazon Cloud WAN 构建您的全球网络
  2. sql 日期和当前日期时间差_详解PostgreSQL 如何获取当前日期时间
  3. Mybatis-puls打印sql语句
  4. python random randint_python中random.randint(1,100)随机数中包不包括1和100
  5. java获取cpu使用率_2019年阿里P8架构师的解析:最新Java性能测试、调优策略
  6. Docker安装禅道项目管理平台zendao-v11.6.x
  7. 热情不减!iPhone12国行首批供货已售罄
  8. 模块间同步消息队列的设计
  9. drools规则引擎源码解析
  10. 普加计划甘特图功能介绍
  11. lua unpack php,Lua 可变参数 和 table.unpack() 函数
  12. python身高体重程序代码_python EM算法4(身高体重数据集)
  13. 让我们再聊聊TDD 续-正其思规其行
  14. python数学符号代码_用Python学数学之Sympy代数符
  15. 《C#零基础入门之百识百例》(五十八)接口 -- 模拟银行存储
  16. 知识付费 知识变现的商业逻辑与实操指南
  17. 读汤用彤之《印度哲学史略》
  18. Win10更新:你的设备中缺少重要的安全和质量修复。
  19. java 配置excel版本_JAVA实现Excel导入/导出 以及excel样式设置
  20. 使用red5和OBS搞出自己的直播平台来挑战bilibili(B站)

热门文章

  1. Gradle中依赖任务产生的不同输出
  2. 使用SAP Analytics Cloud统计SAP C4C系统创建Lead里包含的产品信息分布情况
  3. 用React开发SAP Fiori应用
  4. error when defining a rule - SAP loyalty management的积分定义规则
  5. save product in COMMPR01的调试和调用栈
  6. frontend badi
  7. 用纯CSS实现3D立方体效果
  8. Equipment download - No data contained in BDoc
  9. 如何解决AET field创建失败后的一系列dump
  10. 某互联网公司校园招聘的小组面试题