劍指offer系列-面試題- 53-1 - 在排序數組中查找數字 (python)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章