문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
비어 있지 않은 정수 배열 'nums'가 주어졌을 때, 이 배열의 차수는 배열의 모든 요소 중 가장 높은 빈도수를 갖는 요소로 정의된다.
당신의 목표는 'nums'와 동일한 차수를 갖고 연속된 요소로 이루어진 부분 배열의 최소 길이를 찾는 것이다.
#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을 반환한다.
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;
}
}