কম্পিউটার

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]
  • আকার n-এর বাম দিকের একটি অ্যারে সংজ্ঞায়িত করুন
  • একটি অ্যারে posRight আকারের সংজ্ঞায়িত করুন n এটি n - k দিয়ে পূরণ করুন
  • আরম্ভ করার জন্য i :=k, currMax :=sum[k] - যোগফল[0], যখন i
  • নতুন মোট :=যোগফল[i + 1] - যোগফল[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 দ্বারা কম করুন), করুন −
    • নতুন মোট :=যোগফল[i + k] - যোগফল[i]
    • যদি newTotal>=currMax হয়, তাহলে −
      • currMax :=newTotal
      • পসরাইট[i] :=i
    • অন্যথায়
      • posRight[i] :=posRight[i + 1]
  • req :=0
  • আরম্ভ করার জন্য i :=k, যখন i <=n - 2 * k, আপডেট করুন (i 1 দ্বারা বাড়ান), করুন −
    • l :=posLeft[i - 1], r :=posRight[i + k]
    • temp :=(sum[l + k] - যোগফল[l]) + (sum[i + k] - sum[i]) + (sum[r + k] - যোগফল[r])
    • যদি temp> req হয়, তাহলে −
      • ret[0] :=l, ret[1] :=i, ret[2] :=r
      • req :=temp
  • রিটার্ন রিটার্ন
  • আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

    উদাহরণ

    #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. C++ এ সর্বাধিক সাবয়ারের সমষ্টি m মডিউল

    2. C++ এ ম্যাট্রিক্সে সর্বাধিক পাথ যোগফল

    3. C++ এ একটি ত্রিভুজে সর্বাধিক পাথ যোগফল

    4. C++ এ K আকারের M নন-ওভারল্যাপিং সাবয়ারের সর্বোচ্চ যোগফল