Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी++ में 3 गैर-अतिव्यापी उपसरणियों का अधिकतम योग

मान लीजिए कि हमारे पास एक सरणी है जिसे धनात्मक पूर्णांकों की संख्या कहा जाता है, हमें अधिकतम योग के साथ तीन गैर-अतिव्यापी उपसरणियाँ ढूंढनी होंगी। यहां प्रत्येक सबअरे आकार k का होगा, और हम सभी 3*k प्रविष्टियों के योग को अधिकतम करना चाहते हैं।

हमें प्रत्येक अंतराल की प्रारंभिक स्थिति का प्रतिनिधित्व करने वाले सूचकांकों की सूची के रूप में परिणाम खोजना होगा। यदि एक से अधिक उत्तर हैं, तो हम शब्दावली की दृष्टि से सबसे छोटा उत्तर देंगे।

इसलिए यदि इनपुट [1,2,1,2,6,8,4,1] और k =2 जैसा है, तो परिणाम [0,3,5] होगा, इसलिए उप-सरणी [1,2] हैं, [2,6], [8,4] शुरुआती सूचकांकों [0,3,5] के अनुरूप हैं।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • n :=अंकों का आकार
  • आकार 3 की एक सरणी परिभाषित करें इसे inf से भरें
  • आकार n + 1 के सरणी योग को परिभाषित करें
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • योग[i + 1] =योग[i] + अंक[i]
  • एक सरणी परिभाषित करें posबायां आकार n
  • एक सरणी परिभाषित करें posRight आकार का n इसे n - k से भरें
  • इनिशियलाइज़ करने के लिए i :=k, currMax :=sum[k] - sum[0], जब i
  • newTotal :=sum[i + 1] - sum[i + 1 - k]
  • अगर newTotal> currMax, तो −
    • currMax :=newTotal
    • posLeft[i] :=i + 1 - k
  • अन्यथा
    • posLeft[i] :=posLeft[i - 1]
  • इनिशियलाइज़ करने के लिए i :=n - k-1, currMax :=sum[n] - sum[n - k], जब i>=0, अपडेट (i से 1 घटाएं), करें −
    • newTotal :=sum[i + k] - sum[i]
    • यदि newTotal>=currMax, तो −
      • currMax :=newTotal
      • posRight[i] :=i
    • अन्यथा
      • posRight[i] :=posRight[i + 1]
  • अनुरोध:=0
  • इनिशियलाइज़ i :=k के लिए, जब i <=n - 2 * k, अपडेट करें (i को 1 से बढ़ाएँ), −
      करें
    • l :=posLeft[i - 1], r :=posRight[i + k]
    • अस्थायी:=(योग [एल + के] - योग [एल]) + (योग [i + के] - योग [i]) + (योग [आर + के] - योग [आर])
    • अगर अस्थायी> अनुरोध है, तो −
      • ret[0] :=l, ret[1] :=i, ret[2] :=r
      • अनुरोध:=अस्थायी
  • रिटर्न रिटर्न
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {
          int n = nums.size();
          vector <int> ret(3, INT_MAX);
          vector <int> sum(n + 1);
          for(int i = 0; i < n; i++){
             sum[i + 1] = sum[i] + nums[i];
          }
          vector <int> posLeft(n);
          vector <int> posRight(n, n - k);
          for(int i = k, currMax = sum[k] - sum[0]; i < n; i++){
             int newTotal = sum[i + 1] - sum[i + 1- k];
             if(newTotal > currMax){
                currMax = newTotal;
                posLeft[i] = i + 1 - k;
             }else{
                posLeft[i] = posLeft[i - 1];
             }
          }
          for(int i = n - k - 1, currMax = sum[n] - sum[n - k]; i >=0 ; i--){
             int newTotal = sum[i + k] - sum[i];
             if(newTotal >= currMax){
                currMax = newTotal;
                posRight[i] = i;
             }else{
                posRight[i] = posRight[i + 1];
             }
          }
          int req = 0;
          for(int i = k; i <= n - 2 * k; i++){
             int l = posLeft[i - 1];
             int r = posRight[i + k];
             int temp = (sum[l + k] - sum[l]) + (sum[i + k] - sum[i]) + (sum[r + k] - sum[r]);
             if(temp > req){
                ret[0] = l;
                ret[1] = i;
                ret[2] = r;
                req = temp;
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,2,1,2,6,8,4,1};
       print_vector(ob.maxSumOfThreeSubarrays(v, 2));
    }

    इनपुट

    {1,2,1,2,6,8,4,1}
    2

    आउटपुट

    [0, 3, 5, ]

    1. सी ++ में मैट्रिक्स में अधिकतम पथ योग

      इस समस्या में, हमें M*N आकार का एक 2D मैट्रिक्स दिया गया है। हमारा काम एक प्रोग्राम बनाना है जो मैट्रिक्स में अधिकतम पथ योग ढूंढेगा। यहां, मैट्रिक्स में अधिकतम पथ योग को एक पंक्ति से अंतिम पंक्ति तक सभी तत्वों के योग के रूप में परिभाषित किया गया है। पथ को पार करने के लिए अनुमत चालें नीचे की ओर और व

    1. सी++ में त्रिभुज में अधिकतम पथ योग

      इस समस्या में, हमें ऐसी संख्याएँ दी जाती हैं जो एक त्रिभुज के रूप में होती हैं। हमारा काम एक ऐसा प्रोग्राम बनाना है जो एक त्रिभुज में अधिकतम पथ योग प्राप्त करे। तत्वों को पहली पंक्ति से 1 एक तत्व के साथ व्यवस्थित किया जाता है और फिर अगली पंक्तियों में तत्वों की बढ़ती संख्या के साथ nth पंक्ति में तत

    1. C++ में आकार K के M गैर-अतिव्यापी उप-सरणी का अधिकतम योग

      समस्या कथन एक सरणी और दो संख्या M और K को देखते हुए। हमें सरणी में K (गैर-अतिव्यापी) आकार के अधिकतम M उप-सरणी का योग खोजने की आवश्यकता है। (सरणी का क्रम अपरिवर्तित रहता है)। K सबअरे का आकार है और M सबअरे की गिनती है। यह माना जा सकता है कि सरणी का आकार m*k से अधिक है। यदि कुल सरणी आकार k का गुणज नही