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; } }
|