跟著做的C++20教程-例項11-auto初識
阿新 • • 發佈:2021-02-09
給定n
個整數,找出平均數最大且長度為k
的連續子陣列,並輸出該最大平均數。
示例:
輸入:[1,12,-5,-6,50,3], k = 4
輸出:12.75
解釋:最大平均數 (12-5-6+50)/4 = 51/4 = 12.75
第一版程式碼(直接求解: 每K個求一下平均數)
class Solution: def findMaxAverage(self, nums: List[int], k: int) -> float: res = sum(nums[:k]) / k left, right = 1, k while right < len(nums): if nums[right] > nums[left - 1]: res = max(res, sum(nums[left:right + 1])/k) left += 1 right += 1 return res
第二版程式碼(k定了, 平均值最大, 那麼和就是最大, 不用每次都除以k)
def findMaxAverage(self, nums: List[int], k: int) -> float: res = sum(nums[:k]) left, right = 1, k while right < len(nums): if nums[right] > nums[left - 1]: res = max(res, sum(nums[left:right + 1])) left += 1 right += 1 return res / k
比上面的第一版少了一些除法的計算, 但是結果並沒有改善反而更差了, 說明實際上改善量很小
第三版程式碼(每次都k個數的和, 是比較浪費計算的, 因為每次都只是增加一個數, 減少一個數, 並沒有必要每次都重新求和), 效果提升了很多
class Solution: def findMaxAverage(self, nums: List[int], k: int) -> float: res = sum(nums[:k]) temp = res left, right = 1, k while right < len(nums): temp = temp + nums[right] - nums[left - 1] if temp > res: res = temp left += 1 right += 1 return res / k
第四版程式碼(子陣列的長度是k確定的, 那麼可以只使用一個變數來進行維護) 並沒有改善, 但是其實差別不大
class Solution:
def findMaxAverage(self, nums: List[int], k: int) -> float:
res = sum(nums[:k])
temp = res
# 開始遍歷
for i in range(k, len(nums)):
temp = temp - nums[i-k] + nums[i]
if temp > res:
res = temp
return res / k
第五版程式碼(考慮兩種特殊情況: k=1或k=len(nums)單獨表示, 使程式碼更加清晰) 效果也更好了
class Solution:
def findMaxAverage(self, nums: List[int], k: int) -> float:
size = len(nums)
# 兩種特殊情況
if k == 1:
return max(nums)
if k == size:
return sum(nums) / k
# 初始化資料
res = sum(nums[:k])
temp = res
# 開始遍歷
for i in range(k, size):
temp = temp - nums[i-k] + nums[i]
if temp > res:
res = temp
return res / k