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 arraylength = 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