@@ -43,22 +43,375 @@ k = <code>3</code>
43
43
44
44
<!-- 这里可写通用的实现逻辑 -->
45
45
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
+
46
56
<!-- tabs:start -->
47
57
48
58
### ** Python3**
49
59
50
60
<!-- 这里可写当前语言的特殊实现逻辑 -->
51
61
52
62
``` 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
53
104
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
54
115
```
55
116
56
117
### ** Java**
57
118
58
119
<!-- 这里可写当前语言的特殊实现逻辑 -->
59
120
60
121
``` 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
+ }
61
399
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
+ }
62
415
```
63
416
64
417
### ** ...**
0 commit comments