문제 : https://leetcode.com/problems/arithmetic-slices-ii-subsequence/
정수 배열 nums가 주어지면 모든 arithmetic subsequences 의 수를 구하라.
시퀀스들의 숫자가 3개 이상이고 연속되는 두 요소의 차이가 동일한 경우 arithmetic subsequences라 한다.
i:j->(j-i)가 차이이고 i, j를 포함하는 subsequences 수 (i>j)
4:2->1 [4,2]
6:2->1 [6,2]
6:4->2 [6,4,2]
[6,4]
8:2->1 [8,2]
8:4->1 [8,4]
8:6->3 [8,6,4,2]
[8,6,4]
[8,6]
10:2->1 [10,2]
10:4->1 [10,4]
10:6->2 [10,6,2]
[10,6]
10:8->4 [10,8,6,4,2]
[10,8,6,4]
[10,8,6]
[10,8]
를 구해보면 위와 같다.
문제에서 조건을 보면 subsequence의 원소 수가 3개 이상이어야 한다.
i, j를 포함해야 하므로 모든 subsequence들은 2개 이상의 수를 가지므로 한 개를 제외하고는 모두 3개 이상의 원소를 가진다. 따라서 정답엔 각 수들에 -1한 값들을 더해야 한다.
dp[i][diff] = (j-i)가 차이이고 i, j를 포함하는 subsequences 수.
= dp[0~j][diff] + 1 (j < i)
dp[i][diff] = (j-i)가 차이이고 i, j를 포함하는 subsequences 수.
= dp[0~j][diff] + 1 (j < i)
dp 점화식은 위와 같다.
시간복잡도는 O(N^2).
vector<unordered_map<long, int>> dp(n);
// #1
int cnt = dp[j][diff];
// #2
int cnt = dp[j].count(diff) ? dp[j][diff] : 0;
코드 구현시 unordered_map를 key값으로 조회할 때 #1 과 같은 방법으로 접근하게 짜면 TLE가 발생한다.
#2 로 작성하면 Accepted 를 받을 수 있다.
unordered_map []에 대한 reference를 찾아보았다.
[]를 사용하여 접근하게 되면 key와 매칭되는게 없더라도 map에 element를 하나 추가시켜 컨테이너 사이즈가 증가하게 된다.
따라서, unordered_map에 count가 0인 element들도 쌓이게 되어 크기가 커지게 되고 key 값으로 접근할때도 시간이 증가하게 된다.
사실 알고 있던 부분인데 시간 얼마나 차이나겠어 하고 무시했던 부분이다.. 앞으로는 주의하자.
'알고리즘 문제 > Leetcode' 카테고리의 다른 글
[leetcode] 1137. N-th Tribonacci Number (0) | 2021.09.25 |
---|---|
[leetcode] 115. Distinct Subsequences (0) | 2021.09.19 |
[leetcode] 764. Largest Plus Sign (0) | 2021.09.09 |
[LeetCode] 899. Orderly Queue (0) | 2021.09.05 |
[leetcode] 587. Erect the Fence (0) | 2021.09.04 |
댓글