ধরুন আমাদের দুটি সংখ্যার প্রতিনিধিত্বকারী 0-9 ডিজিট সহ m এবং n দৈর্ঘ্যের দুটি অ্যারে রয়েছে। আমাদের দুটির অঙ্ক থেকে m + n-এর চেয়ে কম দৈর্ঘ্য k এর সর্বাধিক সংখ্যা তৈরি করতে হবে। আমাদের মনে রাখতে হবে যে একই অ্যারে থেকে অঙ্কের আপেক্ষিক ক্রম সংরক্ষণ করতে হবে। আমাদের k সংখ্যার অ্যারে বের করতে হবে। সুতরাং যদি ইনপুটগুলি [3,4,7,5] এবং [9,1,3,5,8,4], এবং k =5 এর মত হয়, তাহলে উত্তর হবে [9,8,7,5,4 ]।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন mergeThem() সংজ্ঞায়িত করুন, এটি একটি অ্যারে সংখ্যা 1, একটি অ্যারে সংখ্যা2,
- একটি অ্যারে ret সংজ্ঞায়িত করুন
- i :=0, j :=0, n :=সংখ্যা 1 এর আকার, m :=সংখ্যা 2 এর আকার
- যখন (i
করুন - যদি বৃহত্তর ফাংশনটিকে কল করা হয় (সংখ্যা1, সংখ্যা2, i, j) সত্য হয়, তাহলে −
- ret এর শেষে nums1[i] ঢোকান
- (i 1 দ্বারা বাড়ান)
- অন্যথায়
- ret এর শেষে nums2[j] ঢোকান
- (j 1 দ্বারা বাড়ান)
- যদি বৃহত্তর ফাংশনটিকে কল করা হয় (সংখ্যা1, সংখ্যা2, i, j) সত্য হয়, তাহলে −
- st থেকে উপাদান মুছুন
- করুন
- ret এর শেষে st-এর শীর্ষ উপাদান সন্নিবেশ করুন
- st থেকে উপাদান মুছুন
- করুন
- যদি i <=n এবং (k - i) <=m, তাহলে −
- একটি অ্যারে প্রার্থীকে সংজ্ঞায়িত করুন =mergeThem(modify(nums1, i), modify(nums2, k - i))
- যদি বড় (প্রার্থী, ret, 0, 0) সত্য হয়, তাহলে −
- ret :=প্রার্থী
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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> mergeThem(vector<int> nums1, vector<int> nums2)
{
vector<int> ret;
int i = 0;
int j = 0;
int n = nums1.size();
int m = nums2.size();
while (i < n || j < m) {
if (greater(nums1, nums2, i, j)) {
ret.push_back(nums1[i]);
i++;
}
else {
ret.push_back(nums2[j]);
j++;
}
}
return ret;
}
vector<int> modify(vector<int>& v, int k)
{
stack<int> st;
vector<int> ret;
for (int i = 0; i < v.size(); i++) {
int x = v[i];
while (!st.empty() && st.top() < x && st.size() + (v.size() - i) - 1 >= k) {
st.pop();
}
if (st.size() < k)
st.push(x);
}
while (!st.empty()) {
ret.push_back(st.top());
st.pop();
}
reverse(ret.begin(), ret.end());
return ret;
}
bool greater(vector<int>& a, vector<int>& b, int i, int j)
{
while (i < a.size() && j < b.size() && a[i] == b[j])
i++, j++;
return j == b.size() || (i < a.size() && a[i] > b[j]);
}
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k)
{
vector<int> ret;
int n = nums1.size();
int m = nums2.size();
for (int i = 0; i <= k; i++) {
if (i <= n && (k - i) <= m) {
vector<int> candidate = mergeThem(modify(nums1, i), modify(nums2, k - i));
if (greater(candidate, ret, 0, 0)) {
ret = candidate;
}
}
}
return ret;
}
};
main() {
Solution ob;
vector<int> v = { 3, 4, 7, 5 }, v1 = { 9, 1, 3, 5, 8, 4 };
print_vector(ob.maxNumber(v, v1, 5));
} ইনপুট
{ 3, 4, 7, 5 }
{ 9, 1, 3, 5, 8, 4 }
5 আউটপুট
[9, 8, 7, 5, 4, ]