From cfe2c8621c41fb8102098114d69e87fd320dd1d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BD=A9=E8=BE=95=E9=BE=99=E5=84=BF?= Date: Tue, 29 Mar 2022 23:36:32 +0800 Subject: [PATCH] =?UTF-8?q?321:=E6=8B=BC=E6=8E=A5=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editor/cn/CreateMaximumNumber.java | 105 ++++++++++++++++++ .../cn/doc/content/CreateMaximumNumber.md | 33 ++++++ 2 files changed, 138 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/CreateMaximumNumber.java create mode 100644 src/main/java/leetcode/editor/cn/doc/content/CreateMaximumNumber.md diff --git a/src/main/java/leetcode/editor/cn/CreateMaximumNumber.java b/src/main/java/leetcode/editor/cn/CreateMaximumNumber.java new file mode 100644 index 0000000..e51caca --- /dev/null +++ b/src/main/java/leetcode/editor/cn/CreateMaximumNumber.java @@ -0,0 +1,105 @@ +//给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接 +//成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。 +// +// 求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。 +// +// 说明: 请尽可能地优化你算法的时间和空间复杂度。 +// +// 示例 1: +// +// 输入: +//nums1 = [3, 4, 6, 5] +//nums2 = [9, 1, 2, 5, 8, 3] +//k = 5 +//输出: +//[9, 8, 6, 5, 3] +// +// 示例 2: +// +// 输入: +//nums1 = [6, 7] +//nums2 = [6, 0, 4] +//k = 5 +//输出: +//[6, 7, 6, 0, 4] +// +// 示例 3: +// +// 输入: +//nums1 = [3, 9] +//nums2 = [8, 9] +//k = 3 +//输出: +//[9, 8, 9] +// Related Topics 栈 贪心 单调栈 👍 458 👎 0 + +package leetcode.editor.cn; + +//321:拼接最大数 +public class CreateMaximumNumber { + public static void main(String[] args) { + Solution solution = new CreateMaximumNumber().new Solution(); + + } + + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int[] maxNumber(int[] nums1, int[] nums2, int k) { + int[] res = new int[0]; + // 从 nums1 中选出长 i 的子序列 + for (int i = 0; i <= k && i <= nums1.length; i++) { + // 从 nums2 中选出长 k - i 的子序列 + if (k - i >= 0 && k - i <= nums2.length) { + // 合并 + int[] tmp = merge(subMaxNumber(nums1, i), subMaxNumber(nums2, k - i)); + // 取最大值 + if (compare(tmp, 0, res, 0)) { + res = tmp; + } + } + } + return res; + } + + // 类似于单调递减栈 + public int[] subMaxNumber(int[] nums, int len) { + int[] subNums = new int[len]; + int cur = 0, rem = nums.length - len; // rem 表示还可以删去多少字符 + for (int i = 0; i < nums.length; i++) { + while (cur > 0 && subNums[cur - 1] < nums[i] && rem > 0) { + cur--; + rem--; + } + if (cur < len) { + subNums[cur++] = nums[i]; + } else { + rem--; // 避免超过边界而少删字符 + } + } + return subNums; + } + + public int[] merge(int[] nums1, int[] nums2) { + int[] res = new int[nums1.length + nums2.length]; + int cur = 0, p1 = 0, p2 = 0; + while (cur < nums1.length + nums2.length) { + if (compare(nums1, p1, nums2, p2)) { // 不能只比较当前值,如果当前值相等还需要比较后续哪个大 + res[cur++] = nums1[p1++]; + } else { + res[cur++] = nums2[p2++]; + } + } + return res; + } + + public boolean compare(int[] nums1, int p1, int[] nums2, int p2) { + if (p2 >= nums2.length) return true; + if (p1 >= nums1.length) return false; + if (nums1[p1] > nums2[p2]) return true; + if (nums1[p1] < nums2[p2]) return false; + return compare(nums1, p1 + 1, nums2, p2 + 1); + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/doc/content/CreateMaximumNumber.md b/src/main/java/leetcode/editor/cn/doc/content/CreateMaximumNumber.md new file mode 100644 index 0000000..094b1ed --- /dev/null +++ b/src/main/java/leetcode/editor/cn/doc/content/CreateMaximumNumber.md @@ -0,0 +1,33 @@ +

给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。

+ +

求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。

+ +

说明: 请尽可能地优化你算法的时间和空间复杂度。

+ +

示例 1:

+ +
输入:
+nums1 = [3, 4, 6, 5]
+nums2 = [9, 1, 2, 5, 8, 3]
+k = 5
+输出:
+[9, 8, 6, 5, 3]
+ +

示例 2:

+ +
输入:
+nums1 = [6, 7]
+nums2 = [6, 0, 4]
+k = 5
+输出:
+[6, 7, 6, 0, 4]
+ +

示例 3:

+ +
输入:
+nums1 = [3, 9]
+nums2 = [8, 9]
+k = 3
+输出:
+[9, 8, 9]
+
Related Topics
  • 贪心
  • 单调栈

  • 👍 458
  • 👎 0
  • \ No newline at end of file