리트코드 누적합 문제다
처음에는 for문 돌려서 모든 합을 구하고, 또 거기서 기존 누적합 결과들을 하나하나 빼는 방식을 생각했는데 아래와 같은 방법을 이용하면 O(n)만에 풀 수 있다.
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
dict={0: 1}
res=0
pr = 0
for no in nums:
pr +=no
if pr-k in dict:
res += dict[pr-k]
if pr not in dict:
dict[pr] = 1
else:
dict[pr]+=1
return res
누적합 변수 pr 에 nums 요소를 하나하나 돌리며 더해줘 누적합을 만든다
그리고 누적합 - 목표값 이 딕셔너리에 있는지 본다 . 과거의 누적합으로 이 값이 나온 적 있었다면 값이 있을 것이고, 이 횟수를 res에 더해준다.
그리고 현재 누적합 값이 딕셔너리에 없다면 1을 넣어주고, 있다면 횟수를 1 증가시킨다.
'Dev > Algorithm' 카테고리의 다른 글
두 트리 비교하기 (1) | 2024.10.14 |
---|---|
친구 네트워크 (3) | 2024.10.14 |
134. Gas Station (1) | 2024.10.08 |
최소 스패닝 트리 find_parent RecursionError (0) | 2024.09.04 |
최대 증가 부분 수열 (0) | 2024.08.29 |