मान लीजिए कि हमारे पास लंबाई के दो सरणियाँ हैं m और n जिसमें अंक 0-9 हैं जो दो संख्याओं का प्रतिनिधित्व करते हैं। हमें लंबाई k की अधिकतम संख्या बनानी होगी जो कि दोनों के अंकों से m + n से कम हो। हमें यह ध्यान रखना होगा कि एक ही सरणी से अंकों के सापेक्ष क्रम को संरक्षित किया जाना चाहिए। हमें k अंकों का सरणी ज्ञात करना है। तो अगर इनपुट [3,4,7,5] और [9,1,3,5,8,4], और के =5 जैसे हैं, तो उत्तर [9,8,7,5,4] होगा ].
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक फ़ंक्शन को परिभाषित करें mergeThem(), यह एक सरणी nums1, एक सरणी nums2, लेगा
- एक सरणी रिट परिभाषित करें
- i :=0, j :=0, n :=nums1 का आकार, m :=nums2 का आकार
- जबकि (i
- यदि फ़ंक्शन को बड़ा कहते हैं(nums1, nums2, i, j) सत्य है, तो −
- रिटर्न के अंत में nums1[i] डालें
- (मैं 1 से बढ़ाएँ)
- अन्यथा
- रिटर्न के अंत में nums2[j] डालें
- (j को 1 से बढ़ाएं)
- यदि फ़ंक्शन को बड़ा कहते हैं(nums1, nums2, i, j) सत्य है, तो −
- सेंट से एलीमेंट हटाएं
- सेवा के अंत में सेंट का शीर्ष तत्व डालें
- सेंट से एलीमेंट हटाएं
- करें
- यदि मैं <=n और (k - i) <=m, तो −
- एक सरणी उम्मीदवार को परिभाषित करें =उन्हें मर्ज करें (संशोधित करें (nums1, i), संशोधित करें (nums2, k - i))
- यदि बड़ा (उम्मीदवार, सेवानिवृत्त, 0, 0) सत्य है, तो -
- सेवानिवृत्त:=उम्मीदवार
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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, ]