[LeetCode] Degree of an Array

아르당·2026년 2월 16일

LeetCode

목록 보기
153/211
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

비어 있지 않은 정수 배열 'nums'가 주어졌을 때, 이 배열의 차수는 배열의 모든 요소 중 가장 높은 빈도수를 갖는 요소로 정의된다.

당신의 목표는 'nums'와 동일한 차수를 갖고 연속된 요소로 이루어진 부분 배열의 최소 길이를 찾는 것이다.

Example

#1
Input: nums = [1, 2, 2, 3, 1]
Output: 2
Explanation:
입력된 배열은 요소 1과 2가 모두 두 번씩 나타나서 차수가 2이다.
차수가 같은 부분 배열은 다음과 같다.
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
가장 짧은 부분 배열의 길이는 2이다. 따라서 2를 반환한다.

#2
Input: nums = [1, 2, 2, 3, 1, 4, 2]
Output: 6
Explanation:
요소 2가 3번 반복돼서 차수는 3이다.
따라서 [2, 2, 3, 1, 4, 2]가 가장 짧은 부분 배열이라서 6을 반환한다.

Constraints

  • nums.length는 1과 50,000 사이에 있다.
  • nums[i]는 0과 49,999 사이의 정수이다.

Solved

class Solution {
    public int findShortestSubArray(int[] nums) {
        Map<Integer, Integer> count = new HashMap<>();
        Map<Integer, Integer> first = new HashMap<>();
        int result = 0;
        int degree = 0;

        for(int i = 0; i < nums.length; ++i){
            first.putIfAbsent(nums[i], i);
            count.put(nums[i], count.getOrDefault(nums[i], 0) + 1);

            if(count.get(nums[i]) > degree){
                degree = count.get(nums[i]);
                result = i - first.get(nums[i]) + 1;
            }else if(count.get(nums[i]) == degree){
                result = Math.min(result, i - first.get(nums[i]) + 1);
            }
        }

        return result;
    }
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글