Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 최대 동일 주파수

<시간/>

양의 정수 배열 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