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
| class Solution { public int[] maxNumber(int[] nums1, int[] nums2, int k) { int x = 0, y = k; List<int[]> list = new LinkedList<>(); for (int i = 0; i <= k; i++, x++, y--) { if (x <= nums1.length && y <= nums2.length) { list.add(merge(maxSubsequence(nums1, x), maxSubsequence(nums2, y))); } }
return list.stream().max(this::cmp).get(); }
private int[] maxSubsequence(int[] nums, int k) { Deque<Integer> stack = new LinkedList<>(); int behind = nums.length - k; for (int num : nums) { while (!stack.isEmpty() && stack.peek() < num && behind > 0) { stack.pop(); behind--; } if (stack.size() < k) { stack.push(num); } else { behind--; } } List<Integer> list = new ArrayList<>(stack); Collections.reverse(list); int[] ans = new int[k]; for (int i = 0; i < list.size(); i++) { ans[i] = list.get(i); } return ans; }
private int[] merge(int[] nums1, int[] nums2) { int[] ans = new int[nums1.length + nums2.length]; int index1 = 0, index2 = 0; for (int i = 0; i < ans.length; i++) { int flag = cmp(nums1, index1, nums2, index2); if (flag < 0) { ans[i] = nums2[index2]; index2++; } else { ans[i] = nums1[index1]; index1++; } } return ans; }
private int cmp(int[] nums1, int[] nums2) { return cmp(nums1, 0, nums2, 0); }
private int cmp(int[] nums1, int index1, int[] nums2, int index2) { if (index1 >= nums1.length) { if (index2 >= nums2.length) { return 0; } else { return -1; } } if (index2 >= nums2.length) { if (index1 >= nums2.length) { return 0; } else { return 1; } }
if (nums1[index1] < nums2[index2]) { return -1; } else if (nums1[index1] == nums2[index2]) { return cmp(nums1, index1 + 1, nums2, index2 + 1); } else { return 1; } } }
|