मान लीजिए कि हमारे पास सकारात्मक पूर्णांकों की एक सरणी संख्या है, हमें दिए गए सरणी संख्याओं के सरणी उपसर्ग की सबसे लंबी संभव लंबाई वापस करनी है, जैसे कि इस उपसर्ग से ठीक एक तत्व को हटाना संभव है ताकि इसमें दिखाई देने वाली प्रत्येक संख्या समान आवृत्ति हो। एक तत्व को हटाने के बाद यदि कोई शेष तत्व नहीं हैं, तो यह अभी भी माना जाता है कि प्रत्येक दिखाई देने वाली संख्या में समान आवृत्ति (0) होती है।
इसलिए, यदि इनपुट [3,3,2,2,6,4,4,6] जैसा है, तो आउटपुट 7 होगा, इसलिए यदि हम इंडेक्स 4 से तत्व 6 को हटाते हैं, तो सबअरे [3,] होगा 3,2,2,4,4] जहां सभी तत्व दो बार प्रकट हुए।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
मैक्सफ़:=0, रेस:=0
-
मानचित्रों को परिभाषित करें cnt और freq
-
इनिशियलाइज़ i :=0 के लिए, जब i <अंकों का आकार, अपडेट करें (i से 1 बढ़ाएँ), करें -
-
एक्स:=अंक [i]
-
(cnt[x] 1 से बढ़ाएं)
-
एफ:=सीएनटी [एक्स]
-
(फ़्रीक्वेंसी [f] 1 से बढ़ाएँ)
-
फ़्रीक [f - 1] को 1 से कम करें
-
अधिकतम:=अधिकतम अधिकतम और f
-
अगर maxf * freq[maxf] i या (maxf - 1) * (freq[maxf - 1] + 1) के समान है, तो i या maxf 1 के समान है, तो -
-
रेस :=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; } }; 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