难度:简单
一、题目描述:
二、解题分析:
1、剑指解析
2、代码实现
I、剑指思路
class Solution:
def extreme_insertion_index(self, nums, target, left):
lo = 0
hi = len(nums)
while lo < hi:
mid = (lo + hi) // 2
if nums[mid] > target or (left and target == nums[mid]):
hi = mid
else:
lo = mid+1
return lo
def search(self, nums: List[int], target: int) -> int:
left_idx = self.extreme_insertion_index(nums, target, True)
# assert that `left_idx` is within the array bounds and that `target`
# is actually in `nums`.
if left_idx == len(nums) or nums[left_idx] != target:
return 0
return self.extreme_insertion_index(nums, target, False)-left_idx
II、二分统计
class Solution:
def __init__(self):
self.count = 0
def search(self, nums: List[int], target: int) -> int:
#递归的停止条件
if len(nums) == 0: return 0
#binary search
mid = len(nums)//2
if nums[mid]==target:
self.count = self.count+1
self.search(nums[:mid],target)
self.search(nums[mid+1:],target)
if nums[mid]<target:
self.search(nums[mid+1:],target)
if nums[mid]>target:
self.search(nums[:mid],target)
return(self.count)
III、线性扫描头尾
class Solution:
def search(self, nums: List[int], target: int) -> int:
for i in range(len(nums)):
if nums[i] == target:
left_idx = i
break
else:
return 0
# find the index of the rightmost appearance of `target` (by reverse
# iteration). it is guaranteed to appear.
for j in range(len(nums)-1, -1, -1):
if nums[j] == target:
right_idx = j
break
return right_idx-left_idx+1