-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathsubarray-sum-equals-k.py
44 lines (33 loc) · 1.42 KB
/
subarray-sum-equals-k.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Solution:
def subarraySum(self, nums, k):
left_right_sums = [0]
for num in nums:
left_right_sums.append(left_right_sums[-1] + num)
right_left_sums = [0]
for num in reversed(nums):
right_left_sums.append(right_left_sums[-1] + num)
right_left_diff_k_map = {}
for pos, rl_sum in enumerate(right_left_sums):
if rl_sum not in right_left_diff_k_map:
right_left_diff_k_map[rl_sum] = []
right_left_diff_k_map[rl_sum].append(len(right_left_sums) - pos - 1)
count = 0
for pos in range(len(left_right_sums)):
remains = left_right_sums[-1] - k - left_right_sums[pos]
if remains in right_left_diff_k_map:
for rl_map_pos in reversed(range(len(right_left_diff_k_map[remains]))):
if right_left_diff_k_map[remains][rl_map_pos] > pos:
count += len(right_left_diff_k_map[remains][:rl_map_pos + 1])
break
return count
class TestSolution:
def setup(self):
self.sol = Solution()
def test_empty1(self):
assert self.sol.subarraySum([], 0) == 0
def test_empty2(self):
assert self.sol.subarraySum([], 1) == 0
def test_custom1(self):
assert self.sol.subarraySum([1,1,1], 2) == 2
def test_custom2(self):
assert self.sol.subarraySum([1,2,1,1], 3) == 2