好好做个API caller,System数组copy函数+Arrays工具类sort函数
//给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
//
//
//
// 说明:
//
//
// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
// 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
//
//
//
//
// 示例:
//
//
//输入:
//nums1 = [1,2,3,0,0,0], m = 3
//nums2 = [2,5,6], n = 3
//
//输出:[1,2,2,3,5,6]
//
//
//
// 提示:
//
//
// -10^9 <= nums1[i], nums2[i] <= 10^9
// nums1.length == m + n
// nums2.length == n
//
// Related Topics 数组 双指针
// 👍 675 👎 0
package leetcode.editor.cn;
import java.util.Arrays;
//Java:合并两个有序数组
public class P88MergeSortedArray {
public static void main(String[] args) {
Solution solution = new P88MergeSortedArray().new Solution();
// TO TEST
int[] a = {1, 2, 3, 0, 0, 0};
int[] b = {2, 5, 6};
solution.merge(a, 3, b, 3);
System.out.println(Arrays.toString(a));
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}
//leetcode submit region end(Prohibit modification and deletion)
}
辅助数组+双指针,O(m+n) : O(m)
//给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
//
//
//
// 说明:
//
//
// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
// 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
//
//
//
//
// 示例:
//
//
//输入:
//nums1 = [1,2,3,0,0,0], m = 3
//nums2 = [2,5,6], n = 3
//
//输出:[1,2,2,3,5,6]
//
//
//
// 提示:
//
//
// -10^9 <= nums1[i], nums2[i] <= 10^9
// nums1.length == m + n
// nums2.length == n
//
// Related Topics 数组 双指针
// 👍 675 👎 0
package leetcode.editor.cn;
import java.util.Arrays;
//Java:合并两个有序数组
public class P88MergeSortedArray {
public static void main(String[] args) {
Solution solution = new P88MergeSortedArray().new Solution();
// TO TEST
int[] a = {1, 2, 3, 0, 0, 0};
int[] b = {2, 5, 6};
solution.merge(a, 3, b, 3);
System.out.println(Arrays.toString(a));
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if (n == 0)
return;
int[] temp = new int[m + n];
m = 0;
n = 0;
int i = 0;
while (m < (nums1.length - nums2.length) && n < nums2.length) {
if (nums1[m] <= nums2[n]) temp[i++] = nums1[m++];
else temp[i++] = nums2[n++];
}
while (m < (nums1.length - nums2.length))
temp[i++] = nums1[m++];
while (n < nums2.length)
temp[i++] = nums2[n++];
for (int j = 0; j < nums1.length; j++) {
nums1[j] = temp[j];
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
}
空间复杂度可以优化,空闲空间已经有了,就是num1的后面,全是0,直接用啊,那么这里就要改变一下双指针移动方向了,从后往前移动,且排大的,空间复杂度直接O(1),上流b( ̄▽ ̄)d。
//给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
//
//
//
// 说明:
//
//
// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
// 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
//
//
//
//
// 示例:
//
//
//输入:
//nums1 = [1,2,3,0,0,0], m = 3
//nums2 = [2,5,6], n = 3
//
//输出:[1,2,2,3,5,6]
//
//
//
// 提示:
//
//
// -10^9 <= nums1[i], nums2[i] <= 10^9
// nums1.length == m + n
// nums2.length == n
//
// Related Topics 数组 双指针
// 👍 675 👎 0
package leetcode.editor.cn;
import java.util.Arrays;
//Java:合并两个有序数组
public class P88MergeSortedArray {
public static void main(String[] args) {
Solution solution = new P88MergeSortedArray().new Solution();
// TO TEST
int[] a = {1, 2, 3, 0, 0, 0};
int[] b = {2, 5, 6};
solution.merge(a, 3, b, 3);
System.out.println(Arrays.toString(a));
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = nums1.length - 1;
m -= 1;
n -= 1;
while (m > -1 && n > -1) {
nums1[i--] = nums1[m] <= nums2[n] ? nums2[n--] : nums1[m--];
}
while (n > -1)
nums1[i--] = nums2[n--];
}
}
//leetcode submit region end(Prohibit modification and deletion)
}