剑指 Offer 53 - I. 在排序数组中查找数字 I
每日几道leetcode刷刷题!
JZ-Offer53
题目描述
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
代码
哈希表解决
class Solution:
def search(self, nums: List[int], target: int) -> int:
dict1 = {}
for i in range(len(nums)):
if nums[i] not in dict1:
dict1[nums[i]] = 1
else:
dict1[nums[i]] += 1
if target in dict1:
return dict1[target]
else:
return 0
如果是普通的数组,显然容易想到用哈希数组来解决,但是,注意用好题目所给的条件,有序数组,那么不妨考虑用二分法来解决。(如果类似这种题,也可以先排序,在二分),寻找左边界和右边界,返回右-左+1
class Solution:
def search(self, nums: List[int], target: int) -> int:
def fl(arr,tar): # 二分找左边界
l,r = 0,len(nums)-1 # 定义二分初始边界
while l <= r: # 循环条件
m = (l+r)//2 # 计算中点
x = nums[m] # 中点值
if x >= tar: r = m - 1 # 缩小右边界,在左半数组中找左边界
else: l = m + 1 # 增大左边界
return l # 返回左边界
def fr(arr,tar): # 二分找右边界
l,r = 0,len(nums)-1 # 定义二分初始边界
while l <=r: # 循环条件
m = (l+r)//2 # 计算中点
x = nums[m] # 中点值
if x <= tar: l = m + 1 # 增大左边界,在右半数组中找右边界
else: r = m -1 # 缩小右边界
return r # 返回右边界
return fr(nums,target) - fl(nums,target) + 1 # 计算距离