1. 程式人生 > 其它 >跟著做的C++20教程-例項11-auto初識

跟著做的C++20教程-例項11-auto初識

技術標籤:LeetCode子陣列LeetCode

643. 子陣列最大平均數 I

給定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