1. 题目
统计一个数字在排序数组中出现的次数。例如,输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。
2. 解题思路
2. 1暴力法
直接遍历,记录该数字的出现次数。
2. 2 二分法
遇到排序数组中的搜索问题,应当第一时间想到二分法。
要得到该数字出现的次数,只需要确定该数字出现的左边界和和右边界。
详情请看 leetcode 面试题53 - I. 在排序数组中查找数字 I(二分法,清晰图解)
3. 代码实现
3.1 暴力法
时间复杂度O(n),空间复杂度S(1)。
class Solution:
def search(nums, target):
count = 0
for i in nums:
if i == target:
count += 1
return count
3.2
时间复杂度O(log2 n),空间复杂度S(1)。
class Solution:
def search(nums, target):
"""
"""
i, j = 0, len(nums)-1
# 获取右边界
while i <= j:
mid = (i+j)//2
if nums[mid] <= target: # 则右边界在mid的右边
i = mid + 1
else: # 则右边界在mid的左边
j = mid - 1
right = i
# 若数组中无 target ,则提前返回
if j >= 0 and nums[j] != target: return 0
# 获取左边界
while i <= j:
mid = (i+j)//2
if nums[mid] < target: # 则左边界在mid的右边
i = mid + 1
else: # 则左边界在mid的左边
j = mid - 1
left = j
return right - left - 1
4. 总结
遇到排序数组中的搜索问题,应当第一时间想到二分法。
5. 参考文献
[1] 剑指offer丛书
[2] 剑指Offer——名企面试官精讲典型编程题