剑指offer二刷——数组专题——数字在升序数组中出现的次数
2024-08-28 09:30:56
题目描述
统计一个数字在升序数组中出现的次数。
我的想法
完整的解法我只想到了遍历数组然后依次统计,但这是不聪明的解法,而且没有利用上“升序数组”的这个条件。
题目标签有提醒可以用二分法解,我想起了大概的思路,但是写不出完整的代码。所以,算法题还是要多刷几遍才行呀,要熟悉解题思路和实现的代码。
这道题给了一个升序数组,一种情况是目标数字出现了至少一次,另外一种情况是目标数字不存在。
没想到的解法 二分
给目标数字集合定义一个上边界和一个下边界。
下边界:升序数组中出现的第一个目标数字;如果数组中不存在目标数字,那么选择比目标数字大的第一个数作为下边界。
上边界:不论升序数组中是否存在目标数字,选择比目标数字大一位的数作为上边界。
最后,上边界-下边界,得到的结果就是该数字在升序数组中出现的次数。如果不存在目标数字,那么上下边界都指向比目标数字大一位的数,结果为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。
最新文章
- KMP匹配算法 - Number Sequence
- WCF (413) Request Entity Too Large
- Computed read-only property vs function in Swift
- Getting Started With Hazelcast 读书笔记(第八章-第十章)
- Spring MVC处理异常的4种方式
- 如何解决winows启动后出现grub?
- Activiti系列:如何把Activiti工程转换为maven工程以解决依赖项找不到的问题
- php ord和chr函数
- 如何在Java 8中愉快地处理日期和时间
- Java之循环语句练习1
- [转载]Spring Beans Auto-Wiring
- 九度OJ 1468 Sharing -- 哈希
- 从无到有开发连麦直播技术<;转>;
- Agent J(求三个圆围成的区域面积)
- 微信上传素材返回 &#39;{";errcode";:41005,";errmsg";:";media data missing";}&#39;,php5.6返回
- 转:NSString什么时候用copy,什么时候用strong
- 一般增广路方法求网络最大流(Ford-Fulkerson算法)
- vue学习笔记(1)—— 组件化实现todoList
- 刚实习的自己-php
- BLEU (Bilingual Evaluation Understudy)