สมมติว่าเรามีจำนวนอาร์เรย์ที่เป็นจำนวนเต็มบวก เราต้องคืนค่าความยาวที่ยาวที่สุดของคำนำหน้าอาร์เรย์ของจำนวนอาร์เรย์ที่กำหนด เพื่อให้สามารถลบองค์ประกอบหนึ่งตัวออกจากคำนำหน้านี้ได้ เพื่อให้ทุกตัวเลขที่ปรากฏอยู่ มีความถี่เท่ากัน หลังจากลบองค์ประกอบหนึ่งรายการแล้วหากไม่มีองค์ประกอบเหลือ จะยังถือว่าทุกหมายเลขที่ปรากฏมีความถี่เท่ากัน (0)
ดังนั้น หากอินพุตเป็น [3,3,2,2,6,4,4,6] เอาต์พุตจะเป็น 7 ดังนั้นหากเราลบองค์ประกอบ 6 ออกจากดัชนี 4 อาร์เรย์ย่อยจะเป็น [3, 3,2,2,4,4] โดยที่องค์ประกอบทั้งหมดปรากฏขึ้นสองครั้ง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
maxf :=0, res :=0
-
กำหนดแผนที่ cnt และความถี่
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของ nums ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
x :=nums[i]
-
(เพิ่ม cnt[x] ขึ้น 1)
-
f :=cnt[x]
-
(เพิ่มความถี่[f] ขึ้น 1)
-
ลดความถี่[f - 1] ลง 1
-
maxf :=สูงสุดของ maxf และ f
-
ถ้า maxf * freq[maxf] เหมือนกับ i หรือ (maxf - 1) * (freq[maxf - 1] + 1) เหมือนกับ i หรือ maxf เหมือนกับ 1 ดังนั้น −
-
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; } }; 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