剑指 Offer 53 - I. 在排序数组中查找数字 I
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
建议尝试思考coding后,在查看答案📖
解题思路:
排序数组中的搜索问题,首先想到二分法解决。
排序数组nums中的所有数字target形成一个窗口。记窗口的左/右边界索引,
分别为left和 right,分别对应窗口左边/右边的首个元素。
本题要求统计数字target的出现次数,可转化为:使用二分法分别找到 左边
界left和右边界right,易得数字target的数量为right-left-1。
由于数组nums中元素都为整数,因此可以分别二分查找target和target-1的右边界,
将两结果相减并返回即可。
复杂度分析:
-
时间复杂度O(log N):二分法为对数级别复杂度。
-
空间复杂度O(1):几个变量使用常数大小的额外空间
from typing import List class Solution: def search(self,nums:List[int],target:int)->int: ##定义一个用二分法找下标的帮助函数 def helper(tar): i,j=0,len(nums)-1#序列左右端的初始位置值 while i<=j: m=(i+j)//2#取中间位置值 if nums[m]<=tar:#找的是和目标值相同,最后一个数的位置值 i=m+1 else: j=m-1 return i#return有缩进,是helper()函数的return return helper(target)-helper(target-1) #return有缩进,是search函数的return a=[1,2,3,4,4,4,5,6,7,8,8,8,] target=4 ##调用类的函数,方法一 S=Solution() print(S.search(a,target))