321.拼接最大数
链接:321.拼接最大数
难度:Hard
标签:栈、贪心、数组、双指针、单调栈
简介:给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。
题解 1 - typescript
- 编辑时间:2020-12-02
- 执行用时:228ms
- 内存消耗:48.7MB
- 编程语言:typescript
- 解法介绍:对于每个单调栈进行遍历。
function maxNumber(nums1: number[], nums2: number[], k: number): number[] {
const ans: number[][] = [];
const pushArr = (nums: number[]) => {
const len = nums.length;
const arrLen = ans.length;
const elLen = ans[0]?.length;
if (arrLen === 0 || elLen === len) ans.push(nums);
else if (elLen < len) {
ans.length = 0;
ans.push(nums);
}
};
const getCache = (nums: number[], k: number): number[] => {
const len = nums.length;
const stack: number[] = [];
if (k === 0) return stack;
k = len - k;
if (k <= 0) return nums;
for (const num of nums) {
if (stack.length === 0) {
stack.push(num);
} else {
let top = stack[stack.length - 1];
while (num > top && k !== 0) {
stack.pop();
k--;
top = stack[stack.length - 1];
}
stack.push(num);
}
}
while (k-- > 0) stack.pop();
return stack;
};
for (let i = 0; i <= k; i++) {
const stack1 = getCache(nums1, i);
const stack2 = getCache(nums2, k - i);
const len1 = stack1.length;
const len2 = stack2.length;
if (len1 === 0) pushArr(stack2);
else if (len2 === 0) pushArr(stack1);
else {
const compare = (p1: number, p2: number): boolean =>
p2 >= len2
? true
: p1 >= len1
? false
: stack1[p1] > stack2[p2]
? true
: stack1[p1] < stack2[p2]
? false
: compare(p1 + 1, p2 + 1);
const arr: number[] = [];
let i1 = 0;
let i2 = 0;
while (i1 !== len1 || i2 !== len2) {
const num1 = stack1[i1];
const num2 = stack2[i2];
if (compare(i1, i2)) {
arr.push(num1);
i1++;
} else {
arr.push(num2);
i2++;
}
}
pushArr(arr);
}
}
const len = ans[0].length;
return ans.sort((nums1: number[], nums2: number[]) => {
let i1 = 0;
let i2 = 0;
while (i1 < len && i2 < len) {
const n1 = nums1[i1];
const n2 = nums2[i2];
if (n1 > n2) {
return -1;
} else if (n1 < n2) {
return 1;
} else {
i1++;
i2++;
}
}
return 0;
})[0];
}