题目:
思路1:
第一想到的应该就是暴力求解了,设置计数器,遍历数组,如果遇到与target相同的数字,就让计数器+1,最后return 计数器即可。
代码如下:
# 最简单的 直接遍历 时间复杂度为O(n)
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 设置计数器temp
temp = 0
for i in range(len(nums)):
if target == nums[i]:
temp += 1
return temp
此方法时间复杂度为O(n)
思路2:
二分法求解,首先要寻找边界值,这里我是先找的右边界right,先定义i,j = 0, len(nums)-1
,之后求出i和j的中点mid,并让中点处的值和target做比较,如果小就右移i,如果大就左移j(这里的目的是为了确定区间)。最后就能确定右边界right=i
。然后让i归零,j可以不动,用同样的方法求解左边界left=j
。最后返回right - left - 1 就是最终结果。
代码如下:
# 二分法
class Solution:
def search(self, nums: List[int], target: int) -> int:
i = 0
j = len(nums) - 1
# 二分法搜索右边界
while i <= j:
mid = (i + j) // 2
if nums[mid] <= target:
i = mid + 1
else:
j = mid - 1
# 确定右边界
right = i
if j >= 0 and nums[j] != target:
return 0
# 二分法确定左边界
i = 0
while i <= j:
mid = (i + j) // 2
if nums[mid] < target:
i = mid + 1
else:
j = mid - 1
left = j
return right - left - 1
此方法时间复杂度为O(logn)。