কম্পিউটার

C++-এ k-এর থেকে বেশি যোগফল নিয়ে সবচেয়ে বড় সাব্যারে


এই টিউটোরিয়ালে, আমরা এমন একটি প্রোগ্রাম লিখতে যাচ্ছি যেখানে সবচেয়ে বড় সাবয়ারের যোগফল k এর থেকে বেশি আছে।

আসুন সমস্যা সমাধানের পদক্ষেপগুলি দেখি৷

  • অ্যারে শুরু করুন।
  • অ্যারের উপর পুনরাবৃত্তি করুন এবং সূচকের সাথে একটি ভেক্টরে প্রতিটি সূচকে যোগফল সংরক্ষণ করুন।
  • উপরের যোগফলগুলি যোগফল এবং সূচকের উপর ভিত্তি করে সাজান।
  • সূচী সংরক্ষণ করার জন্য একটি অ্যারে শুরু করুন।
  • একটি লুপ লিখুন যা n.
      পর্যন্ত পুনরাবৃত্তি করে
    • উপরের সূচক অ্যারে এবং পূর্ববর্তী সমষ্টি অ্যারে সূচকের ন্যূনতম সূচক সহ মানগুলি আপডেট করুন।
  • যোগফলকে ০ তে শুরু করুন।
  • একটি লুপ লিখুন যা n.
      পর্যন্ত পুনরাবৃত্তি করে
    • সমষ্টিতে বর্তমান উপাদান যোগ করুন।
    • যদি যোগফল k এর থেকে বড় হয়।
      • সর্বোচ্চ সাবয়ারের দৈর্ঘ্য হল i + 1।
    • অন্যথায় সর্বাধিক সাবয়ারের দৈর্ঘ্য হল
      • বাইনারি অনুসন্ধান ব্যবহার করে পূর্ববর্তী যোগফল থেকে সূচক খুঁজুন।
      • যে যোগফলটি যোগফল - k - 1 এর চেয়ে কম তা হল উপাদান সূচক যা আমরা চাই।

উদাহরণ

আসুন কোডটি দেখি।

#include <bits/stdc++.h>
using namespace std;
bool compare(const pair<int, int>& a, const pair<int, int>& b) {
   if (a.first == b.first) {
      return a.second < b.second;
   }
   return a.first < b.first;
}
int findIndex(vector<pair<int, int> >& previousSums, int n, int val) {
   int start = 0;
   int end = n - 1;
   int mid, result = -1;
   while (start <= end) {
      mid = (start + end) / 2;
      if (previousSums[mid].first <= val) {
         result = mid;
         start = mid + 1;
      }else {
         end = mid - 1;
      }
   }
   return result;
}
int getLargestSubArray(int arr[], int n, int k) {
   int maxLength = 0;
   vector<pair<int, int> > previousSums;
   int sum = 0, minIndexes[n];
   for (int i = 0; i < n; i++) {
      sum = sum + arr[i];
      previousSums.push_back({ sum, i });
   }
   sort(previousSums.begin(), previousSums.end(), compare);
   minIndexes[0] = previousSums[0].second;
   for (int i = 1; i < n; i++) {
      minIndexes[i] = min(minIndexes[i - 1], previousSums[i].second);
   }
   sum = 0;
   for (int i = 0; i < n; i++) {
      sum = sum + arr[i];
      if (sum > k) {
         maxLength = i + 1;
      }else {
         int ind = findIndex(previousSums, n, sum - k - 1);
         if (ind != -1 && minIndexes[ind] < i) {
            maxLength = max(maxLength, i - minIndexes[ind]);
         }
      }
   }
   return maxLength;
}
int main() {
   int arr[] = { 5, 3, -3, 2, 4, 7 };
   int k = 5, n = 6;
   cout << getLargestSubArray(arr, n, k) << endl;
   return 0;
}

আউটপুট

আপনি যদি উপরের কোডটি চালান, তাহলে আপনি নিম্নলিখিত ফলাফল পাবেন।

6

উপসংহার

টিউটোরিয়ালে আপনার কোন প্রশ্ন থাকলে মন্তব্য বিভাগে উল্লেখ করুন।


  1. C++-এ সাবারের যোগফল K সমান

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

  3. C++ এ সর্বাধিক সাবয়ারের সমষ্টি m মডিউল

  4. C++ এ উপসর্গ যোগ ব্যবহার করে O(n) তে সর্বাধিক সাবয়ারের যোগফল