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——名企面試官精講典型編程題