কম্পিউটার টিউটোরিয়াল

C++-এ সর্বোচ্চ সমান ফ্রিকোয়েন্সি (Maximum Equal Frequency) বের করা

একটি ধনাত্মক পূর্ণসংখ্যার অ্যারে nums দেওয়া আছে। আমাদের সবচোটে প্রিফিক্স দৈর্ঘ্য বের করতে হবে যাতে সেখান থেকে ঠিক একটি এলিমেন্ট মুছে দিলে বাকি সব সংখ্যার ফ্রিকোয়েন্সি সমান হয়ে যায়। যদি মুছে দিলে কিছুই না থাকে, তবে সেটিও বৈধ (ফ্রিকোয়েন্সি ০)।

উদাহরণ

ইনপুট: [3,3,2,2,6,4,4,6] → আউটপুট: 7

ব্যাখ্যা: ইন্ডেক্স ৪-এর ৬ মুছে দিলে সাবঅ্যারে [3,3,2,2,4,4] হবে যেখানে সব সংখ্যা ২ বার করে আসছে।

সমাধানের ধাপসমূহ

  1. cnt[x] = সংখ্যা x-এর ফ্রিকোয়েন্সি।
  2. freq[f] = ফ্রিকোয়েন্সি f পাওয়া সংখ্যাগুলোর কাউন্ট।
  3. প্রতিটি এলিমেন্ট প্রসেস করার সময় maxFreq আপডেট করুন।
  4. ৩টি বৈধ কেস চেক করুন:
    • maxFreq * freq[maxFreq] == i (সব সংখ্যার ফ্রিকোয়েন্সি সমান, শেষটা বাদ দিলে)
    • (maxFreq-1) * (freq[maxFreq-1] + 1) == i (একটা সংখ্যার ফ্রিকোয়েন্সি বেশি, সেটা কমালে)
    • maxFreq == 1 (সব সংখ্যা একবারই আসছে)
  5. বৈধ হলে res = i + 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;
    }
};

int 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
  1. C++-এ দেওয়া N-এর সমান যোগফল দেয় এমন সর্বোচ্চ প্রাইম সংখ্যা

  2. C++-এ তিনটি স্ট্যাকের সমান সর্বোচ্চ যোগফল বের করুন

  3. C++-এ চতুর্ভুজের সর্বোচ্চ ক্ষেত্রফল

  4. C++-এ LCM যা গুণফলের সমান হয় এমন সর্বোচ্চ দৈর্ঘ্যের সাবঅ্যারে