321. Create Maximum Number

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
class Solution {
public int[] maxNumber(int[] nums1, int[] nums2, int k) {
List<Integer> maxNumberList = new ArrayList<>();
for (int i = 0; i < k; i++) {
maxNumberList.add(0);
}

for (int nums1Count = 0; nums1Count <= k; nums1Count++) {
int nums2Count = k - nums1Count;
if (nums1Count > nums1.length || nums2Count > nums2.length) {
continue;
}

List<Integer> nums1List = getMaxNumber(nums1, nums1Count);
List<Integer> nums2List = getMaxNumber(nums2, nums2Count);

List<Integer> mergedNumberList = merge(nums1List, nums2List);
maxNumberList = max(maxNumberList, mergedNumberList);
}

int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = maxNumberList.get(i);
}
return res;
}

private List<Integer> max(List<Integer> listA, List<Integer> listB) {
for (int i = 0; i < listA.size(); i++) {
if (listA.get(i) > listB.get(i)) {
return listA;
} else if (listA.get(i) < listB.get(i)) {
return listB;
}
}

return listA;
}

private List<Integer> merge(List<Integer> nums1List, List<Integer> nums2List) {
List<Integer> numList = new ArrayList<>(nums1List.size() + nums2List.size());
int i = 0, j = 0;
for (int k = 0; k < nums1List.size() + nums2List.size(); k++) {
if (i == nums1List.size()) {
numList.add(nums2List.get(j++));
} else if (j == nums2List.size()) {
numList.add(nums1List.get(i++));
} else if (greatThan(nums1List, i, nums2List, j)) {
numList.add(nums1List.get(i++));
} else {
numList.add(nums2List.get(j++));
}
}
return numList;
}

private boolean greatThan(List<Integer> nums1List, int i, List<Integer> nums2List, int j) {
if (nums1List.get(i) > nums2List.get(j)) {
return true;
} else if (nums1List.get(i) < nums2List.get(j)) {
return false;
} else {
// 相同则比较后面的数字
i++;
j++;
if (i == nums1List.size()) {
return false;
}
if (j == nums2List.size()) {
return true;
}
return greatThan(nums1List, i, nums2List, j);
}
}

private List<Integer> getMaxNumber(int[] nums, int count) {
if (count == 0) {
return Collections.emptyList();
}

// 非严格单调递减栈
List<Integer> numList = new ArrayList<>();
int delete = nums.length - count;
for (int num : nums) {
while (!numList.isEmpty() && num > numList.get(numList.size() - 1) && delete > 0) {
numList.remove(numList.size() - 1);
delete--;
}
numList.add(num);
}
while (delete > 0) {
numList.remove(numList.size() - 1);
delete--;
}
return numList;
}
}

References

321. Create Maximum Number