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 की एक सरणी freq परिभाषित करें और इसे 0 से भरें
  • max_ := 0
  • nums में प्रत्येक n के लिए:
    • freq[n] को 1 से बढ़ाएं
    • max_ := max(max_, freq[n]) का अधिकतम
  • freq सरणी को 0 से भरें।
  • min_ := nums का आकार
  • i := 0, j := -1, आकार := nums का आकार से शुरू करके j < आकार तक लूप चलाएं:
    • यदि j >= 0 और freq[nums[j]] == max_, तो:
      • min_ := min(min_, j - i + 1)
      • freq[nums[i++]] को घटाएं
    • अन्यथा यदि j < आकार - 1, तो:
      • j को 1 से बढ़ाएं
      • freq[nums[j]] को 1 से बढ़ाएं
    • अन्यथा:
      • लूप से बाहर निकलें
  • min_ वापस करें

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:

उदाहरण

#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_; 
    } 
}; 
int main(){ 
    Solution ob; 
    vector<int> v = {1, 2, 2, 3, 1}; 
    cout << (ob.findShortestSubArray(v)); 
}

इनपुट

{1, 2, 2, 3, 1}

आउटपुट

2
  1. - C++ में Array क्लास

    C++ में Array क्लास पर्याप्त कुशल है और यह अपना आकार भी जानती है।ऐरे पर ऑपरेशन करने के लिए उपयोग किए जाने वाले फंक्शन्सsize() = ऐरे का आकार लौटाने के लिए यानी ऐरे के एलिमेंट्स की संख्या लौटाता है।max_size() = ऐरे के अधिकतम एलिमेंट्स की संख्या लौटाने के लिए।get(), at(), operator[] = ऐरे एलिमेंट्स तक

  1. - C++ में स्ट्रिंग्स की सरणी

    इस खंड में हम देखेंगे कि C++ में स्ट्रिंग्स की सरणी को कैसे परिभाषित किया जाए। जैसा कि हम जानते हैं कि C में कोई स्ट्रिंग्स नहीं थीं। हमें कैरेक्टर सरणी का उपयोग करके स्ट्रिंग्स बनानी पड़ती थीं। इसलिए कुछ स्ट्रिंग्स की सरणी बनाने के लिए, हमें कैरेक्टर्स की 2-आयामी सरणी बनानी पड़ती थी। प्रत्येक पंक्

  1. - C++ में सॉर्टिंग

    इस सेक्शन में हम देखेंगे कि C++ में सॉर्टिंग एल्गोरिदम कैसे निष्पादित करें। एक सॉर्टेड ऐरे एक ऐरे है जिसमें प्रत्येक एलिमेंट किसी क्रम में सॉर्टेड होते हैं जैसे न्यूमेरिकल, अल्फाबेटिकल आदि। एक न्यूमेरिकल ऐरे को सॉर्ट करने के लिए कई एल्गोरिदम हैं जैसे बबल सॉर्ट, इन्सर्शन सॉर्ट, सिलेक्शन सॉर्ट, मर्ज स