📖 오늘의 학습 키워드
투포인터
[Continuous Subarrays]
https://leetcode.com/problems/continuous-subarrays/description/
class Solution {
public long continuousSubarrays(int[] nums) {
long answer = 0;
int i = 0;
int len = nums.length;
TreeMap<Integer, Integer> map = new TreeMap<>();
for (int j = 0; j < len; j++) {
map.merge(nums[j], 1, Integer::sum);
while (map.lastKey() - map.firstKey() > 2) {
map.merge(nums[i], -1, Integer::sum);
if (map.get(nums[i]) == 0) {
map.remove(nums[i]);
}
i++;
}
answer += j - i + 1;
}
return answer;
}
}
i
는 윈도우의 시작을 가리키는 포인터이며, 0으로 초기화한다.map
을 선언한다. 현재 윈도우의 최댓값과 최솟값을 편하게 구하기 위해 key값이 정렬된 TreepMap
을 사용한다.j
는 윈도우의 마지막을 가리키는 포인터이며, nums의 모든 원소가 그 값이 되게끔 0부터 len(nums의 길이)-1까지 for 문을 돌린다.nums[j]
값을 map에 추가한다.nums[i]
값의 개수를 하나씩 줄이고 i
의 값을 하나씩 늘린다. 이때, nums[i]의 개수가 0이 되면 map에서 nums[i]를 제거한다.j - i + 1
로 구하고 이를 answer에 더한다.map
의 merge
메소드 활용
key 값이 존재하는지 확인한 후 value 값을 업데이트하거나 새로운 key와 value 값을 넣어주는 코드를 위처럼 간단하게 작성할 수 있었다.