এই টিউটোরিয়ালে, আমরা এমন একটি প্রোগ্রাম লিখতে যাচ্ছি যেখানে সবচেয়ে বড় সাবয়ারের যোগফল 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
উপসংহার
টিউটোরিয়ালে আপনার কোন প্রশ্ন থাকলে মন্তব্য বিভাগে উল্লেখ করুন।