統計一個數字在排序數組中出現的次數。
示例 1:
輸入: nums = [5,7,7,8,8,10], target = 8
輸出: 2
示例 2:
輸入: nums = [5,7,7,8,8,10], target = 6
輸出: 0
限制:
0 <= 數組長度 <= 50000
注意:本題與主站 34 題相同(僅返回值不同):https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
思路1:遍歷
直接遍歷統計
class Solution:
def search(self, nums: List[int], target: int) -> int:
cnt = 0
for n in nums:
if n == target:
cnt += 1
return cnt
思路2:二分
由於題目給出的條件是有序的數組,所以目標值是在一起的,所以我們只需要確定目標值的區間就行,然後區間長度就是要求的個數。可以從兩端搜索區間左端點和右端點,也可以利用二分查找,找出區間的左端點有右端點。
有時間總結下二分的各種寫法。
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 基於排序數組,利用二分找到目標區間:
l1, r1 = 0, len(nums) - 1
while l1 <= r1:
mid = (l1 + r1) >> 1
if nums[mid] >= target:
r1 = mid - 1
else:
l1 = mid + 1
l2, r2 = 0, len(nums) - 1
while l2 <= r2:
mid = (l2 + r2) >> 1
if nums[mid] > target:
r2 = mid - 1
else:
l2 = mid + 1
# print(l1, r1)
# print(l2, r2)
return l2 - r1 - 1