ধরুন আমাদের একটি অ্যারে A আছে, আমাদের এটিকে বাম এবং ডানে দুটি সাবয়ারে ভাগ করতে হবে যাতে −
-
বাম সাবয়ারের প্রতিটি উপাদান ডান সাবয়ারের প্রতিটি উপাদানের থেকে কম বা সমান।
-
বাম এবং ডান সাব্যারে অ-খালি।
-
বাম সাবয়ারের সম্ভাব্য আকার সবচেয়ে ছোট।
এই ধরনের পার্টিশন করার পরে আমাদের বাম দৈর্ঘ্য খুঁজে বের করতে হবে। এটা নিশ্চিত যে এই ধরনের পার্টিশন বিদ্যমান।
সুতরাং ইনপুট যদি [5,0,3,8,6] এর মত হয়, তাহলে আউটপুট হবে 3, বাম অ্যারে যেমন হবে [5,0,3] এবং ডান সাবয়ারে হবে [8,6]।পি>
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
n :=A এর আকার, n
আকারের একটি ম্যাক্সক্স অ্যারে তৈরি করুন -
minVal :=A
এর শেষ উপাদান -
maxx[0] :=A[0]
-
1 থেকে n – 1
রেঞ্জের জন্য i-
maxx[i] :=A[i] এবং A[i – 1]
এর সর্বোচ্চ
-
-
উত্তর :=A – 1 এর আকার
-
i রেঞ্জ n – 1 থেকে 1
এর মধ্যে-
minVal :=সর্বনিম্ন minVal এবং A[i]
-
যদি minVal>=max[i – 1] হয়, তাহলে উত্তর :=i
-
-
উত্তর ফেরত দিন
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h> using namespace std; class Solution { public: int partitionDisjoint(vector <int>& A) { int n = A.size(); vector <int> maxx(n); int minVal = A[n - 1]; maxx[0] = A[0]; for(int i = 1; i < n; i++){ maxx[i] = max(A[i], maxx[i - 1]); } int ans = A.size() - 1; for(int i = n - 1; i >= 1; i--){ minVal = min(minVal, A[i]); if(minVal >= maxx[i - 1]){ ans = i; } } return ans; } }; main(){ vector<int> v1 = {5,0,3,8,6}; Solution ob; cout << (ob.partitionDisjoint(v1)); }
ইনপুট
[5,0,3,8,6]
আউটপুট
3