Leetcode Java Arithmetic Slices II - Subsequence
업데이트:
문제
코드
class Solution {
public int numberOfArithmeticSlices(int[] nums) {
int result = 0;
int length = nums.length;
int[][] dp = new int[length][length];
Map<Long, List<Integer>> map = new HashMap<>();
for (int i = 0; i < length; i++) {
for (int j = i + 1; j < length; j++) {
List<Integer> list = map.get(nums[i] - (nums[j] - (long) nums[i]));
if (list == null) {
continue;
}
for (int num : list) {
dp[i][j] += dp[num][i] + 1;
}
result += dp[i][j];
}
map.computeIfAbsent((long) nums[i], k -> new ArrayList<>()).add(i);
}
return result;
}
}
결과
설명
- 정수 배열 nums의 최소 3개 이상의 요소가 포함된 부분 배열이 산술적 수열이 되는 조합의 수를 반환하는 문제이다.
- 각 요소 간 값의 차이가 동일한 값들을 모은 부분 배열은 산술적 수열이다.
- 테스트 케이스는 결과가 32 비트 정수가 되도록 제공된다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 산술적 수열이 되는 조합의 수를 저장하기 위한 변수로, 0으로 초기화한다.
- length는 nums의 길이를 저장할 변수로, nums의 길이로 초기화한다.
- dp는 각 부분 수열의 개수를 계산하기 위한 변수로, $length \times length$ 크기의 2차원 정수 배열로 초기화한다.
- map은 nums 내 각 요소의 위치 값을 저장하기 위한 변수로, HashMap으로 초기화한다.
- 0부터 length 미만까지 i를 증가시키며 반복하여 아래를 수행한다.
- $i + 1$ 부터 length 미만까지 j를 증가시키며 반복하여 아래를 수행한다.
- map에서 nums의 j번째 값과 i번째 값의 차이만큼 발생하는 i번째 값 이하 값에 해당하는 List를 가져온다.
- list가 null인 경우 동일한 차이가 발생하는 값이 존재하지 않으므로, 무시하고 j를 증가시켜 반복을 계속 수행한다.
- list의 값들을 반복하여 dp[i][j]의 값에 $dp[num][i] + 1$을 계속 더해준다.
- result에 dp[i][j] 값을 더해 가능한 부분 배열의 수를 증가시킨다.
- map에 nums의 i번째 값이 있는지 확인하여 없으면 새 ArrayList를 넣고, 해당 List에 해당 값의 위치인 i를 넣어준다.
- $i + 1$ 부터 length 미만까지 j를 증가시키며 반복하여 아래를 수행한다.
- 반복이 완료되면 nums 내 3개 이상의 요소를 이용한 부분 배열이 산술적 수열이 되는 개수를 계산한 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기