สมมติว่าเรามีอาร์เรย์สองอาร์เรย์ที่มีความยาว m และ n โดยมีตัวเลข 0-9 แทนตัวเลขสองตัว เราต้องสร้างจำนวนความยาวสูงสุด k ที่น้อยกว่า m + n จากตัวเลขทั้งสอง เราต้องจำไว้ว่าต้องรักษาลำดับสัมพัทธ์ของตัวเลขจากอาร์เรย์เดียวกัน เราต้องหาอาร์เรย์ของตัวเลข k ดังนั้นหากอินพุตเป็นเช่น [3,4,7,5] และ [9,1,3,5,8,4] และ k =5 คำตอบจะเป็น [9,8,7,5,4 ].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน mergeThem() ซึ่งจะใช้อาร์เรย์ nums1 อาร์เรย์ nums2
- กำหนดอาร์เรย์ ret
- ผม :=0, j :=0, n :=ขนาดของ nums1, m :=ขนาดของ nums2
- ในขณะที่ (i
- ถ้าเรียกใช้ฟังก์ชันมากขึ้น (nums1, nums2, i, j) เป็นจริง −
- ใส่ nums1[i] ที่ส่วนท้ายของ ret
- (เพิ่ม i ขึ้น 1)
- มิฉะนั้น
- แทรก nums2[j] ที่ส่วนท้ายของ ret
- (เพิ่ม j ขึ้น 1)
- ถ้าเรียกใช้ฟังก์ชันมากขึ้น (nums1, nums2, i, j) เป็นจริง −
- x :=v[i]
- ในขณะที่ (st ไม่ว่างและองค์ประกอบบนสุดของ st
=k) ทำ − - ลบองค์ประกอบออกจาก st
- ถ้าขนาดของ st
- ใส่ x เข้าไปใน st
- ใส่องค์ประกอบด้านบนของ st ที่ส่วนท้ายของ ret
- ลบองค์ประกอบออกจาก st
- เพิ่ม i 1 และเพิ่ม j 1
- ถ้าฉัน <=n และ (k - i) <=m แล้ว −
- กำหนดตัวเลือกอาร์เรย์ =mergeThem(modify(nums1, i), modified(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, ]