题目描述
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
- 初始化 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]
解题思路
方法一
直接将nums2数组添加在nums1数组尾部,然后在进行排序。
代码如下:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n); // 将nums2数组 从 下标0处开始拷贝至 数组nums1 ,存放从 下标 m 开始 长度为 n
java.util.Arrays.sort(nums1,0, m+n); // 对nums1进行排序 排序范围 0 ~m+n
}
}
就两行代码解决问题。
资源耗费情况
时间 | 内存 |
---|---|
2ms | 36.2MB |
方法二
使用 双指针尾部 法, 即 nums1是输出数组,由于nums1有足够大的空间容纳, 即从nums的尾部开始存储,比较nums1 ,nums2两者的最大值并存入。
定义 p 指向 nums1 数组 末尾, 定义 p1 指向 nums1 最后的数位(即 m - 1), 定义 p2 指向 nums2 的最后的数值位(即n - 1),
逐位比较,将俩者之间最大值存入nums1数组 p 所指向位置,然后 p前移一位, 较大者的指针也进行前移一位;直到 p1 或 p2 为0.
最后,如果 p2 不为 0 则进行循环将nums2的数组剩余值拷贝值 nums1 的 空值, 即 p 所指的剩余部分,当 p 为0时候, p2也就为0了,至此结束。
代码部分
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 有序数组通常使用指针法 双指针
// 由于nums是输出数组, 尽量减少时间和空间的使用 题目已经说明空间够用
// 从大往小排 指针均值向末尾 p1 -> nums[m-1] p2 -> nums[n-1] p -> nums[nums.length - 1]
int p1 = m - 1;
int p2 = n - 1;
int p = m + n - 1;
while(p1>=0 && p2>=0){
if(nums1[p1] <= nums2[p2]){
nums1[p--] = nums2[p2--];
}else{
nums1[p--] = nums1[p1--];
}
}
while(p2>=0){
nums1[p--] = nums2[p2--];
}
}
}
资源耗费情况
时间 | 内存 |
---|---|
1ms | 35.8MB |
这部分参考