Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

องศาของอาร์เรย์ใน C++


สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มไม่ติดลบที่เรียกว่า 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
  • มิฉะนั้น
    • ออกมาจากวงจร
  • คืนขั้นต่ำ_
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #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