题目描述

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

我的想法

完整的解法我只想到了遍历数组然后依次统计,但这是不聪明的解法,而且没有利用上“升序数组”的这个条件。

题目标签有提醒可以用二分法解,我想起了大概的思路,但是写不出完整的代码。所以,算法题还是要多刷几遍才行呀,要熟悉解题思路和实现的代码。

这道题给了一个升序数组,一种情况是目标数字出现了至少一次,另外一种情况是目标数字不存在。

没想到的解法  二分

给目标数字集合定义一个上边界和一个下边界。

下边界:升序数组中出现的第一个目标数字;如果数组中不存在目标数字,那么选择比目标数字大的第一个数作为下边界。

上边界:不论升序数组中是否存在目标数字,选择比目标数字大一位的数作为上边界。

最后,上边界-下边界,得到的结果就是该数字在升序数组中出现的次数。如果不存在目标数字,那么上下边界都指向比目标数字大一位的数,结果为0。

# -*- coding:utf-8 -*-
class Solution:
def GetNumberOfK(self, data, k):
# write code here
l,r=0,len(data)
lbound,rbound=0,0
#寻找下边界
while l<r:
mid=l+(r-l)/2
if data[mid]<k:
l=mid+1
else: r=mid
lbound=l
#寻找上边界
l,r=0,len(data)
while l<r:
mid=l+(r-l)/2
if data[mid]<=k:
l=mid+1
else: r=mid
rbound=l
return rbound-lbound

 时间复杂度o(logn)  空间复杂度o(1)

写代码时,得到上下边界的过程中,如果 data[mid]=k,左右指针的取值是需要注意的。

计算下边界时,当 data[mid]=k,应该让 r=mid;

计算上边界时,当 data[mid]=k,应该让 l=mid+1。

最新文章

  1. KMP匹配算法 - Number Sequence
  2. WCF (413) Request Entity Too Large
  3. Computed read-only property vs function in Swift
  4. Getting Started With Hazelcast 读书笔记(第八章-第十章)
  5. Spring MVC处理异常的4种方式
  6. 如何解决winows启动后出现grub?
  7. Activiti系列:如何把Activiti工程转换为maven工程以解决依赖项找不到的问题
  8. php ord和chr函数
  9. 如何在Java 8中愉快地处理日期和时间
  10. Java之循环语句练习1
  11. [转载]Spring Beans Auto-Wiring
  12. 九度OJ 1468 Sharing -- 哈希
  13. 从无到有开发连麦直播技术&lt;转&gt;
  14. Agent J(求三个圆围成的区域面积)
  15. 微信上传素材返回 &#39;{&quot;errcode&quot;:41005,&quot;errmsg&quot;:&quot;media data missing&quot;}&#39;,php5.6返回
  16. 转:NSString什么时候用copy,什么时候用strong
  17. 一般增广路方法求网络最大流(Ford-Fulkerson算法)
  18. vue学习笔记(1)—— 组件化实现todoList
  19. 刚实习的自己-php
  20. BLEU (Bilingual Evaluation Understudy)

热门文章

  1. 4. 树形DP
  2. 用seaborn绘制散点图
  3. 8.java设计模式之装饰者模式
  4. Serilog 源码解析——数据的保存(下)
  5. Mysql数据安全备份
  6. 利用代理IP池(proxy pool)搭建免费ip代理和api
  7. 百度ping工具
  8. 企业级工作流解决方案(十五)--集成Abp和ng-alain--Abp其他改造
  9. MathType可以和哪些Microsoft Office版本一起使用?
  10. jQuery 第二章 实例方法 DOM操作选择元素相关方法