양의 정수 배열 nums가 있다고 가정하고 주어진 배열 nums의 배열 접두어의 가능한 가장 긴 길이를 반환해야 하므로 이 접두어에서 정확히 하나의 요소를 삭제할 수 있으므로 그 안에 나타난 모든 숫자가 삭제됩니다. 같은 주파수를 갖는다. 남아있는 요소가 없으면 하나의 요소를 제거한 후에도 나타나는 모든 숫자가 동일한 빈도(0)를 갖는 것으로 간주됩니다.
따라서 입력이 [3,3,2,2,6,4,4,6]과 같으면 출력은 7이 됩니다. 따라서 인덱스 4에서 요소 6을 제거하면 하위 배열은 [3, 3,2,2,4,4] 여기서 모든 요소는 두 번 나타납니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
최대값 :=0, 해상도 :=0
-
맵 cnt 및 freq 정의
-
initialize i :=0의 경우, i <숫자의 크기일 때 업데이트(i를 1만큼 증가), 수행 -
-
x :=숫자[i]
-
(cnt[x]를 1씩 증가)
-
f :=cnt[x]
-
(freq[f]를 1씩 증가)
-
freq[f - 1]를 1만큼 감소
-
maxf :=maxf 및 f의 최대값
-
maxf * freq[maxf]가 i와 같거나 (maxf - 1) * (freq[maxf - 1] + 1)이 i와 같거나 maxf가 1과 같으면 -
-
해상도 :=나는 + 1
-
-
-
반환 해상도
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxEqualFreq(vector<int>& nums) { int maxf = 0, res = 0; map<int, int> cnt, freq; for (int i = 0; i < nums.size(); i++) { int x = nums[i]; cnt[x]++; int f = cnt[x]; freq[f]++; freq[f - 1]--; maxf = max(maxf, f); if (maxf * freq[maxf] == i || (maxf - 1) * (freq[maxf - 1] + 1) == i || maxf == 1) { res = i + 1; } } return res; } }; main(){ Solution ob; vector<int> v = {3,3,2,2,6,4,4,6}; cout << (ob.maxEqualFreq(v)); }
입력
{3,3,2,2,6,4,4,6}
출력
7