Skip to content

Commit 74ca58c

Browse files
authored
feat: add solutions to lc problem: No.0321 (doocs#1586)
No.0321.Create Maximum Number
1 parent bc55c52 commit 74ca58c

File tree

7 files changed

+1026
-0
lines changed

7 files changed

+1026
-0
lines changed

solution/0300-0399/0321.Create Maximum Number/README.md

+353
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,375 @@ k = <code>3</code>
4343

4444
<!-- 这里可写通用的实现逻辑 -->
4545

46+
**方法一:枚举 + 单调栈**
47+
48+
我们可以枚举从数组 $nums1$ 中取出 $x$ 个数,那么从数组 $nums2$ 中就需要取出 $k-x$ 个数。其中 $x \in [max(0, k-n), min(k, m)]$。
49+
50+
对于每一个 $x$,我们可以使用单调栈求出数组 $nums1$ 中长度为 $x$ 的最大子序列,以及数组 $nums2$ 中长度为 $k-x$ 的最大子序列。然后将这两个子序列合并得到长度为 $k$ 的最大子序列。
51+
52+
最后,我们比较所有的长度为 $k$ 的最大子序列,找出最大的序列即可。
53+
54+
时间复杂度 $O(k \times (m + n + k^2))$,空间复杂度 $O(k)$。其中 $m$ 和 $n$ 分别是数组 $nums1$ 和 $nums2$ 的长度。
55+
4656
<!-- tabs:start -->
4757

4858
### **Python3**
4959

5060
<!-- 这里可写当前语言的特殊实现逻辑 -->
5161

5262
```python
63+
class Solution:
64+
def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:
65+
def f(nums: List[int], k: int) -> List[int]:
66+
n = len(nums)
67+
stk = [0] * k
68+
top = -1
69+
remain = n - k
70+
for x in nums:
71+
while top >= 0 and stk[top] < x and remain > 0:
72+
top -= 1
73+
remain -= 1
74+
if top + 1 < k:
75+
top += 1
76+
stk[top] = x
77+
else:
78+
remain -= 1
79+
return stk
80+
81+
def compare(nums1: List[int], nums2: List[int], i: int, j: int) -> bool:
82+
if i >= len(nums1):
83+
return False
84+
if j >= len(nums2):
85+
return True
86+
if nums1[i] > nums2[j]:
87+
return True
88+
if nums1[i] < nums2[j]:
89+
return False
90+
return compare(nums1, nums2, i + 1, j + 1)
91+
92+
def merge(nums1: List[int], nums2: List[int]) -> List[int]:
93+
m, n = len(nums1), len(nums2)
94+
i = j = 0
95+
ans = [0] * (m + n)
96+
for k in range(m + n):
97+
if compare(nums1, nums2, i, j):
98+
ans[k] = nums1[i]
99+
i += 1
100+
else:
101+
ans[k] = nums2[j]
102+
j += 1
103+
return ans
53104

105+
m, n = len(nums1), len(nums2)
106+
l, r = max(0, k - n), min(k, m)
107+
ans = [0] * k
108+
for x in range(l, r + 1):
109+
arr1 = f(nums1, x)
110+
arr2 = f(nums2, k - x)
111+
arr = merge(arr1, arr2)
112+
if ans < arr:
113+
ans = arr
114+
return ans
54115
```
55116

56117
### **Java**
57118

58119
<!-- 这里可写当前语言的特殊实现逻辑 -->
59120

60121
```java
122+
class Solution {
123+
public int[] maxNumber(int[] nums1, int[] nums2, int k) {
124+
int m = nums1.length, n = nums2.length;
125+
int l = Math.max(0, k - n), r = Math.min(k, m);
126+
int[] ans = new int[k];
127+
for (int x = l; x <= r; ++x) {
128+
int[] arr1 = f(nums1, x);
129+
int[] arr2 = f(nums2, k - x);
130+
int[] arr = merge(arr1, arr2);
131+
if (compare(arr, ans, 0, 0)) {
132+
ans = arr;
133+
}
134+
}
135+
return ans;
136+
}
137+
138+
private int[] f(int[] nums, int k) {
139+
int n = nums.length;
140+
int[] stk = new int[k];
141+
int top = -1;
142+
int remain = n - k;
143+
for (int x : nums) {
144+
while (top >= 0 && stk[top] < x && remain > 0) {
145+
--top;
146+
--remain;
147+
}
148+
if (top + 1 < k) {
149+
stk[++top] = x;
150+
} else {
151+
--remain;
152+
}
153+
}
154+
return stk;
155+
}
156+
157+
private int[] merge(int[] nums1, int[] nums2) {
158+
int m = nums1.length, n = nums2.length;
159+
int i = 0, j = 0;
160+
int[] ans = new int[m + n];
161+
for (int k = 0; k < m + n; ++k) {
162+
if (compare(nums1, nums2, i, j)) {
163+
ans[k] = nums1[i++];
164+
} else {
165+
ans[k] = nums2[j++];
166+
}
167+
}
168+
return ans;
169+
}
170+
171+
private boolean compare(int[] nums1, int[] nums2, int i, int j) {
172+
if (i >= nums1.length) {
173+
return false;
174+
}
175+
if (j >= nums2.length) {
176+
return true;
177+
}
178+
if (nums1[i] > nums2[j]) {
179+
return true;
180+
}
181+
if (nums1[i] < nums2[j]) {
182+
return false;
183+
}
184+
return compare(nums1, nums2, i + 1, j + 1);
185+
}
186+
}
187+
```
188+
189+
### **C++**
190+
191+
```cpp
192+
class Solution {
193+
public:
194+
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
195+
auto f = [](vector<int>& nums, int k) {
196+
int n = nums.size();
197+
vector<int> stk(k);
198+
int top = -1;
199+
int remain = n - k;
200+
for (int x : nums) {
201+
while (top >= 0 && stk[top] < x && remain > 0) {
202+
--top;
203+
--remain;
204+
}
205+
if (top + 1 < k) {
206+
stk[++top] = x;
207+
} else {
208+
--remain;
209+
}
210+
}
211+
return stk;
212+
};
213+
function<bool(vector<int>&, vector<int>&, int, int)> compare = [&](vector<int>& nums1, vector<int>& nums2, int i, int j) -> bool {
214+
if (i >= nums1.size()) {
215+
return false;
216+
}
217+
if (j >= nums2.size()) {
218+
return true;
219+
}
220+
if (nums1[i] > nums2[j]) {
221+
return true;
222+
}
223+
if (nums1[i] < nums2[j]) {
224+
return false;
225+
}
226+
return compare(nums1, nums2, i + 1, j + 1);
227+
};
228+
229+
auto merge = [&](vector<int>& nums1, vector<int>& nums2) {
230+
int m = nums1.size(), n = nums2.size();
231+
int i = 0, j = 0;
232+
vector<int> ans(m + n);
233+
for (int k = 0; k < m + n; ++k) {
234+
if (compare(nums1, nums2, i, j)) {
235+
ans[k] = nums1[i++];
236+
} else {
237+
ans[k] = nums2[j++];
238+
}
239+
}
240+
return ans;
241+
};
242+
243+
int m = nums1.size(), n = nums2.size();
244+
int l = max(0, k - n), r = min(k, m);
245+
vector<int> ans(k);
246+
for (int x = l; x <= r; ++x) {
247+
vector<int> arr1 = f(nums1, x);
248+
vector<int> arr2 = f(nums2, k - x);
249+
vector<int> arr = merge(arr1, arr2);
250+
if (ans < arr) {
251+
ans = move(arr);
252+
}
253+
}
254+
return ans;
255+
}
256+
};
257+
```
258+
259+
### **Go**
260+
261+
```go
262+
func maxNumber(nums1 []int, nums2 []int, k int) []int {
263+
m, n := len(nums1), len(nums2)
264+
l, r := max(0, k-n), min(k, m)
265+
f := func(nums []int, k int) []int {
266+
n := len(nums)
267+
stk := make([]int, k)
268+
top := -1
269+
remain := n - k
270+
for _, x := range nums {
271+
for top >= 0 && stk[top] < x && remain > 0 {
272+
top--
273+
remain--
274+
}
275+
if top+1 < k {
276+
top++
277+
stk[top] = x
278+
} else {
279+
remain--
280+
}
281+
}
282+
return stk
283+
}
284+
285+
var compare func(nums1, nums2 []int, i, j int) bool
286+
compare = func(nums1, nums2 []int, i, j int) bool {
287+
if i >= len(nums1) {
288+
return false
289+
}
290+
if j >= len(nums2) {
291+
return true
292+
}
293+
if nums1[i] > nums2[j] {
294+
return true
295+
}
296+
if nums1[i] < nums2[j] {
297+
return false
298+
}
299+
return compare(nums1, nums2, i+1, j+1)
300+
}
301+
302+
merge := func(nums1, nums2 []int) []int {
303+
m, n := len(nums1), len(nums2)
304+
ans := make([]int, m+n)
305+
i, j := 0, 0
306+
for k := range ans {
307+
if compare(nums1, nums2, i, j) {
308+
ans[k] = nums1[i]
309+
i++
310+
} else {
311+
ans[k] = nums2[j]
312+
j++
313+
}
314+
}
315+
return ans
316+
}
317+
318+
ans := make([]int, k)
319+
for x := l; x <= r; x++ {
320+
arr1 := f(nums1, x)
321+
arr2 := f(nums2, k-x)
322+
arr := merge(arr1, arr2)
323+
if compare(arr, ans, 0, 0) {
324+
ans = arr
325+
}
326+
}
327+
return ans
328+
}
329+
330+
func max(a, b int) int {
331+
if a > b {
332+
return a
333+
}
334+
return b
335+
}
336+
337+
func min(a, b int) int {
338+
if a < b {
339+
return a
340+
}
341+
return b
342+
}
343+
```
344+
345+
### **TypeScript**
346+
347+
```ts
348+
function maxNumber(nums1: number[], nums2: number[], k: number): number[] {
349+
const m = nums1.length;
350+
const n = nums2.length;
351+
const l = Math.max(0, k - n);
352+
const r = Math.min(k, m);
353+
let ans: number[] = Array(k).fill(0);
354+
for (let x = l; x <= r; ++x) {
355+
const arr1 = f(nums1, x);
356+
const arr2 = f(nums2, k - x);
357+
const arr = merge(arr1, arr2);
358+
if (compare(arr, ans, 0, 0)) {
359+
ans = arr;
360+
}
361+
}
362+
return ans;
363+
}
364+
365+
function f(nums: number[], k: number): number[] {
366+
const n = nums.length;
367+
const stk: number[] = Array(k).fill(0);
368+
let top = -1;
369+
let remain = n - k;
370+
for (const x of nums) {
371+
while (top >= 0 && stk[top] < x && remain > 0) {
372+
--top;
373+
--remain;
374+
}
375+
if (top + 1 < k) {
376+
stk[++top] = x;
377+
} else {
378+
--remain;
379+
}
380+
}
381+
return stk;
382+
}
383+
384+
function compare(nums1: number[], nums2: number[], i: number, j: number): boolean {
385+
if (i >= nums1.length) {
386+
return false;
387+
}
388+
if (j >= nums2.length) {
389+
return true;
390+
}
391+
if (nums1[i] > nums2[j]) {
392+
return true;
393+
}
394+
if (nums1[i] < nums2[j]) {
395+
return false;
396+
}
397+
return compare(nums1, nums2, i + 1, j + 1);
398+
}
61399

400+
function merge(nums1: number[], nums2: number[]): number[] {
401+
const m = nums1.length;
402+
const n = nums2.length;
403+
const ans: number[] = Array(m + n).fill(0);
404+
let i = 0;
405+
let j = 0;
406+
for (let k = 0; k < m + n; ++k) {
407+
if (compare(nums1, nums2, i, j)) {
408+
ans[k] = nums1[i++];
409+
} else {
410+
ans[k] = nums2[j++];
411+
}
412+
}
413+
return ans;
414+
}
62415
```
63416

64417
### **...**

0 commit comments

Comments
 (0)