题目要求
统计一个数字在排序数组中出现的次数。
解题思路
分治
- 若数组为空,则返回0。
- 先查找包含目标数字在数组中位置的左边界。
- 若不含目标数字,则直接返回0;若有目标数字则记录这个位置。
- 继续查找目标数字在数组中位置的右边界。
- return 右边界+1-左边界,即为所求次数。
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 数组为空,返回0。
if not nums:
return 0
# 先查找包含目标数字在数组中位置的左边界。
l = 0
r = len(nums) - 1
m = (l + r) // 2
while l != r:
if nums[m] >= target:
r = m
else:
l = m + 1
m = (l + r) // 2
# 若不含目标数字,则直接返回0。
if nums[r] != target:
return 0
# 若有目标数字则记录这个位置。
left = l
# 继续查找目标数字在数组中位置的右边界。
r = len(nums) - 1
m = (l + r + 1) // 2
while l != r:
if nums[m] <= target:
l = m
else:
r = m - 1
m = (l + r + 1) // 2
# return 右边界+1-左边界,即为所求次数。
return r + 1 - left