给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
法1:使用API
使用System.arraycopy函数复制,并用 Arrays.sort排序。
执行用时:0ms,在所有Java提交中击败了100.00%的用户
内存消耗:38.4MB,在所有Java提交中击败了71.72%的用户
法2:归并排序思想
创建一个额外数组,同时遍历nums1和nums2,将较小的存到额外数组中,直到nums1和nums2 中某一个遍历完,接着将没遍历完数组中剩下的赋给额外数组。
执行用时:0ms,在所有Java提交中击败了100.00%的用户
内存消耗:38.4MB,在所有Java提交中击败了75.58%的用户
package 数组;
import org.junit.Test;
import java.util.Arrays;
public class 合并两个有序数组_88 {
/*
法1:使用API
使用System.arraycopy函数复制,并用 Arrays.sort排序
执行用时:0ms,在所有Java提交中击败了100.00%的用户
内存消耗:38.4MB,在所有Java提交中击败了71.72%的用户
*/
public static void merge(int[] nums1, int m, int[] nums2, int n) {
/*
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src:源数组;
srcPos:源数组要复制的起始位置;
dest:目的数组;
destPos:目的数组放置的起始位置;
length:复制的长度.
*/
System.arraycopy(nums2,0,nums1,m,n);
Arrays.sort(nums1);
}
/*
法2:归并排序思想
创建一个额外数组,同时遍历nums1和nums2,将较小的存到额外数组中,直到nums1和nums2中某一个遍历完,接着将没遍历完数组中剩下的赋给额外数组
执行用时:0ms,在所有Java提交中击败了100.00%的用户
内存消耗:38.4MB,在所有Java提交中击败了75.58%的用户
*/
public static void merge2(int[] nums1, int m, int[] nums2, int n){
int i=0,j=0,k=0;
int temp[]=new int[500];
while (i<m&&j<n){
if (nums1[i]<nums2[j])
temp[k++]=nums1[i++];
else temp[k++]=nums2[j++];
}
//将没遍历完数组中剩下的赋给额外数组
for (; i < m; i++) {
temp[k++]=nums1[i];
}
for (; j < n; j++) {
temp[k++]=nums2[j];
}
//将temp赋给num1(题目要求修改num1)
for (int l = 0; l < m+n; l++) {
nums1[l]=temp[l];
}
}
public static void main(String[] args) {
int []a={1,2,3,0,0,0};
int []b={2,5,6};
merge(a,3,b,3);
}
}