Description

You are given an integer array nums consisting of n elements, and an integer k.

Find a contiguous subarray whose length is equal to k that has the maximum average value and return this value. Any answer with a calculation error less than 10-5 will be accepted.

Example 1:

  • Input: nums = [1,12,-5,-6,50,3], k = 4
  • Output: 12.75000
  • Explanation: Maximum average is (12 - 5 - 6 + 50) / 4 = 51 / 4 = 12.75

Example 2:

  • Input: nums = [5], k = 1
  • Output: 5.00000

Constraints:

  • n == nums.length
  • 1 <= k <= n <= 105
  • -104 <= nums[i] <= 104

Submitted Code

class Solution(object):
    def findMaxAverage(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: float
        """
        subarrys = len(nums) - k + 1    # 가능한 subarrys 개수
        max_sum = float('-inf')         # 최소값으로 초기화
        
        for i in range(subarrys):
            if i == 0:
                curr_sum = sum(nums[:k])                      # 최초 슬라이스
            else:
                prev_sum = curr_sum                           # 기존 슬라이스
                curr_sum = prev_sum - nums[i-1] + nums[i+k-1] # 기존값에서 -1칸 앞 값 + 1칸 뒤 값
                
            max_sum = max(curr_sum, max_sum)                  # 최대값 갱신
        
        return max_sum / float(k)

Runtime: 79 ms | Beats 62.75%
Memory: 19.16 MB | Beats 42.94%

매번 슬라이스마다 원소의 합을 새로 구하면 너무 오래걸리기 때문에 이전 슬라이스의 값을 활용하는 방법을 사용했다.

nums = [1,12,-5,-6,50,3], k = 4

subarrys = 3
max_sum = -Infinity

nums   1,  12,  -5,  -6,  50,   3
---------------------------------
i=0    1 + 12 + -5 + -6            =  2 (=max_sum)
i=1   -1            (2) + 50       = 51 (=max_sum)
i=2       -12            (51) + 3  = 42

51 / 4 = 12.75

return 12.75

Other Solutions

1st

class Solution:
    def findMaxAverage(self, nums: List[int], k: int) -> float:
        
        currsum = sum(nums[:k])
        maxval = currsum / k
        for i in range(k, len(nums)):
            currsum -= nums[i-k]
            currsum += nums[i]
            if currsum / k > maxval:
                maxval = currsum/k

        return maxval

time complexity: 𝑂(𝑛)
space complexity: 𝑂(1)

이 방법처럼 맨 처음 슬라이스를 먼저 계산 후 그 다음부터 반복문으로 계산하는 것이 더 깔끔한 것 같다.

Leave a comment