สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มไม่ติดลบที่เรียกว่า nums ระดับของอาร์เรย์นี้เป็นความถี่สูงสุดขององค์ประกอบใดๆ เราต้องหาความยาวที่เล็กที่สุดที่เป็นไปได้ของอาร์เรย์ย่อยของ nums ที่ต่อเนื่องกันซึ่งมีดีกรีเท่ากับ nums
ดังนั้น หากอินพุตเป็น [1,2,2,3,1] เอาต์พุตจะเป็น 2 เนื่องจากอาร์เรย์อินพุตมีระดับ 2 เนื่องจากองค์ประกอบที่ 1 และ 2 ปรากฏขึ้นสองครั้ง อาร์เรย์ย่อยที่มีดีกรีเท่ากัน − [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2 , 2, 3], [2, 2] ความยาวที่สั้นที่สุดคือ 2 ดังนั้นคำตอบจะเป็น 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดความถี่อาร์เรย์ขนาด 50000 และเติมค่านี้ด้วย 0
- max_ :=0
- สำหรับแต่ละ n ใน nums
- (เพิ่มความถี่[n] ขึ้น 1)
- max_ :=สูงสุดของ max_ และ freq[n]
- เติมอาร์เรย์ความถี่ด้วย 0
- min_ :=ขนาดของ nums
- สำหรับการเริ่มต้น i :=0, j :=-1, size :=ขนาดของ nums เมื่อ j
- ถ้า j>=0 และ freq[nums[j]] เท่ากับ max_ แล้ว −
- min_ :=ขั้นต่ำของ min_ และ j - i + 1
- มิฉะนั้นเมื่อ j
- เพิ่ม j ขึ้น 1
- เพิ่ม freq[nums[j]] ขึ้น 1
- ถ้า j>=0 และ freq[nums[j]] เท่ากับ max_ แล้ว −
- ออกมาจากวงจร
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: int findShortestSubArray(vector<int>& nums) { vector<int> freq(50000, 0); int max_ = 0; for (const int n : nums) max_ = max(max_, ++freq[n]); fill(freq.begin(), freq.end(), 0); int min_ = nums.size(); for (int i = 0, j = -1, size = nums.size(); j < size;) { if (j >= 0 && freq[nums[j]] == max_) min_ = min(min_, j - i + 1), --freq[nums[i++]]; else if (j < size - 1) ++freq[nums[++j]]; else break; } return min_; } }; main(){ Solution ob; vector<int> v = {1, 2, 2, 3, 1}; cout << (ob.findShortestSubArray(v)); }
อินพุต
{1, 2, 2, 3, 1}
ผลลัพธ์
2