Leetcode # 523. Continuous Subarray Sum

Problem

https://leetcode.com/problems/continuous-subarray-sum/

First Try
[Time Limit Exceeded  81 / 99 testcases passed]

Time Complexity: O(len(nums) ** 2)
Space Complexity: O(len(nums) ** 2)
(The input and output generally do not count towards the space complexity.)

Ver. 1

class Solution:
  def checkSubarraySum(self, nums: List[int], k: int) -> bool:
    if len(nums) < 2: return False

    def _check_sub_array_sum(nums, k, sub_sum):
      if len(nums) < 2:    return False
      if sub_sum % k == 0: return True

      result =  _check_sub_array_sum(nums[1:], k, sub_sum - nums[0]) \
                or _check_sub_array_sum(nums[:-1], k, sub_sum - nums[-1])
      return result

    sub_sum = sum(nums)
    return _check_sub_array_sum(nums, k, sub_sum)

 

Ver. 2: Memoization

class Solution:
  def checkSubarraySum(self, nums: List[int], k: int) -> bool:
    if len(nums) < 2: return False
    start_n_end = {}

    def _check_sub_array_sum(nums, k, sub_sum, start, end):
      nonlocal start_n_end
      if len(nums) < 2:    return False
      if sub_sum % k == 0: return True
      _range = (start, end)
      if _range in start_n_end: return start_n_end[_range]

      result =  _check_sub_array_sum(nums[1:], k, sub_sum - nums[0], (start + 1), end) \
                or _check_sub_array_sum(nums[:-1], k, sub_sum - nums[-1], start, (end - 1))
      start_n_end[_range] = result
      return result

    sub_sum = sum(nums)
    return _check_sub_array_sum(nums, k, sub_sum, 0, len(nums) - 1)

Solution: Prefix Sum + Hash Table

相關例題

Algorithm

  • k = 5
  • nums = 
    1 5 2 1 5 2 1 3
  • $$ prefix\_sum[i] := \sum^{i – 1}_{k = 0}{num[k]} $$
    prefix_sum = 

    0 1 6 8 9 14 16 17 20
  • prefix_mod := prefix_sum % k =
    0 1 1 3 4 4 1 2 0

    prefix_mod[x] = a ⇒sum(nums[:x]) = n * k + a
    if ∃ y ≤ x – 2 s.t. prefix_mod[y] = a ⇒ nums[y:x] is a good sub array

    • length = 2 – 1 = 1 < 2
      1 1
    • length = 2 – 1 = 1 < 2
      4 4
    • sum[2:6] = [2, 1, 5, 2, 1]; sum[1:6] = [5, 2, 1, 5, 2, 1]; sum[0:8] = [1, 5, 2, 1, 5, 2, 1]
      1 3 4 4 1

      1 1 3 4 4 1

      0 1 1 3 4 4 1 2 0

 

Time Complexity: O(len(nums))
Space Complexity: O(len(nums))
(The input and output generally do not count towards the space complexity.)

class Solution:
  def checkSubarraySum(self, nums: List[int], k: int) -> bool:
    prefix_sum = [0] * (len(nums) + 1)
    for i in range(1, len(nums) + 1):
      prefix_sum[i] = prefix_sum[i - 1] + nums[i - 1]
    m_seen = defaultdict(list)
    for x, psum in enumerate(prefix_sum):
      m = psum % k
      if m in m_seen:
        for y in m_seen[m]:
          if x - y >= 2: return True
      m_seen[m].append(x)
    return False

Last Updated on 2024/06/09 by A1go

目錄
Bitnami