leetcode算法刷题记录之合并两个有序数组

/**
 * 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
 * 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,
 * 这样它就有足够的空间保存来自 nums2 的元素。
 * 
 * 示例 1:
 *  输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
 *  输出:[1,2,2,3,5,6]
 * 
 * 示例 2:
 *  输入:nums1 = [1], m = 1, nums2 = [], n = 0
 *  输出:[1]
 * 
 * 提示:
 *  nums1.length == m + n
 *  nums2.length == n
 *  0 <= m, n <= 200
 *  1 <= m + n <= 200
 *  -109 <= nums1[i], nums2[i] <= 109
 * 
 * 解题思路一(merge1):
 *  1. 长度为m+n的数组sorted,存储最终数组。
 *  2. 利用排序数组特性,把nums1,nums2看作2个队列,分别从2个队列中取小值。
 *  3. 用两个指针p1,p2分别作为2个指针的头部。
 *  时间复杂度:O(m+n)。
 *  指针移动单调递增,最多移动 m+n 次,因此时间复杂度为 O(m+n)。
 *  空间复杂度:O(m+n)。
 *  需要建立长度为 m+n 的中间数组 sorted。
 * 
 * 解题思路二:
 *  1.与思路一相比,在空间上可以稍作优化。
 *  2.逆向双指针,由于nums1后半部分是空的,我们可以指针设置从后向前遍历。(逆向双指针)
 *  3.取较大者放进nums1的后面。
 */

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
// var merge1 = function(nums1, m, nums2, n) {
//     let p1 = 0;p2 = 0;
//     const sorted = new Array(m+n).fill(0);
//     var cur;
//     while(p1<m||p2<n){
//         if(p1 == m){
//             cur = nums2[p2++];
//         }else if(p2 == n){
//             cur = nums1[p1++];
//         }else if(nums1[p1]<nums2[p2]){
//             cur = nums1[p1++];
//         }else{
//             cur = nums2[p2++];
//         }
//         sorted[p1+p2-1] = cur;
//     }
//     for(let i=0;i!=m+n;++i){
//         nums1[i] = sorted[i];
//     }
// };
var merge = function(nums1, m, nums2, n) {
    let p1 = m-1;p2 = n-1,tail = m+n-1;
    var cur;
    while(p1>=0||p2>=0){
        if(p1 == -1){
            cur = nums2[p2--];
        }else if(p2 == -1){
            cur = nums1[p1--];
        }else if(nums1[p1]>nums2[p2]){
            cur = nums1[p1--];
        }else{
            cur = nums2[p2--];
        }
        nums1[tail--] = cur;
    }
};
var nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3;
merge(nums1, m, nums2, n);
console.log(nums1);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值