[99클럽 코테 스터디 27일차 TIL] 투 포인터

qk·2024년 6월 23일
0

회고

목록 보기
27/33
post-thumbnail

📖 오늘의 학습 키워드
투포인터

오늘의 회고

문제

[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;
    }
}
  1. i는 윈도우의 시작을 가리키는 포인터이며, 0으로 초기화한다.
  2. 현재 윈도우에 포함된 nums 원소와 그 개수를 저장할 map을 선언한다. 현재 윈도우의 최댓값과 최솟값을 편하게 구하기 위해 key값이 정렬된 TreepMap을 사용한다.
  3. j는 윈도우의 마지막을 가리키는 포인터이며, nums의 모든 원소가 그 값이 되게끔 0부터 len(nums의 길이)-1까지 for 문을 돌린다.
  4. nums[j] 값을 map에 추가한다.
  5. map의 최댓값과 최솟값의 차이가 2보다 작을 때까지 nums[i] 값의 개수를 하나씩 줄이고 i의 값을 하나씩 늘린다. 이때, nums[i]의 개수가 0이 되면 map에서 nums[i]를 제거한다.
  6. subarray의 마지막 인덱스가 j일 때 subarray의 개수를 j - i + 1로 구하고 이를 answer에 더한다.

새로 학습한 내용

mapmerge 메소드 활용
key 값이 존재하는지 확인한 후 value 값을 업데이트하거나 새로운 key와 value 값을 넣어주는 코드를 위처럼 간단하게 작성할 수 있었다.

0개의 댓글