ধরুন আমাদের কাছে একটি অ্যারে আছে যার নাম ধনাত্মক পূর্ণসংখ্যার সংখ্যা, আমাদের সর্বাধিক যোগফল সহ তিনটি অ ওভারল্যাপিং সাব্যারে খুঁজে বের করতে হবে। এখানে প্রতিটি সাবয়ারের আকার হবে 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]
- currMax :=newTotal
- posleft[i] :=i + 1 - k
- posLeft[i] :=posLeft[i - 1]
- নতুন মোট :=যোগফল[i + k] - যোগফল[i]
- যদি newTotal>=currMax হয়, তাহলে −
- currMax :=newTotal
- পসরাইট[i] :=i
- অন্যথায়
- posRight[i] :=posRight[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, ]