두 개의 숫자를 나타내는 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() 함수를 정의하면 배열 nums1, 배열 nums2,
- ret 배열 정의
- i :=0, j :=0, n :=nums1의 크기, m :=nums2의 크기
- 동안(i
- Great(nums1, nums2, i, j) 함수 호출이 true이면 -
- ret 끝에 nums1[i] 삽입
- (i를 1씩 증가)
- 그렇지 않으면
- ret 끝에 nums2[j] 삽입
- (j를 1씩 증가)
- Great(nums1, nums2, i, j) 함수 호출이 true이면 -
- st에서 요소 삭제
- ret 끝에 st의 최상위 요소 삽입
- st에서 요소 삭제
- i <=n이고 (k - i) <=m이면 −
- 배열 후보 정의 =mergeThem(modify(nums1, i), modify(nums2, k - i))
- Greater(candidate, 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, ]