LeetCode算法学习之--数组--合并两个有序数组

694 阅读2分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

大家好今天给大家分享下一道 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]

分析

1.2个都为有序数组

2.num1.len = m+n

3.合并到num1上去

解法

1.迭代

2.sort

3.逆向双指针

解法一:迭代法

思路
1.添加一个条额外的数组res来存储值
2.迭代比较2个的大小,小的放入res中
3.如果有数组还有剩余的值 则全部放入res
4.再用res 更新nums1
*/

var merge = function (nums1, m, nums2, n) {
  // 创建一个额外的数组
  let res = [];
  let i = 0,
    j = 0;


  // 先迭代这2个数组
  while (i < m && j < n) {
    // 比较他们的大小
    if (nums1[i] <= nums2[j]) {
      res.push(nums1[i++]);
    } else {
      res.push(nums2[j++]);
    }
  }

  //   处理剩下的数组元素
  res = res.concat(nums1.slice(i, m));
  res = res.concat(nums2.slice(j, n));

  for (let i = 0; i < res.length; i++) {
    nums1[i] = res[i];
  }
};
/* 复杂度
时间 O(n+m)
空间 O(n+m)
*/

1.png

解法二:sort

思路 
1.把数组组合在一起
2.在使用sort的方式变成一个有序数组

*/

var merge = function (nums1, m, nums2, n) {
  // 合并数组
  for (let i = 0; i < n; i++) {
    nums1[i + m] = nums2[i];
  }

  //   使用sort 排序
  nums1.sort((a, b) => a - b);
};

/* 复杂度
时间 O((n+m)log(n+m))
空间 O(log(m+n))
*/

2.png

解法三:逆向双指针

思路
1.因为num1.len = m+n
2.因为正向比较修改nums1,当nums2比num1小的时候,会丢失Nums1的元素
3.所以采取逆向比较

*/

// 代码借鉴 https://leetcode-cn.com/problems/merge-sorted-array/solution/
var merge = function (nums1, m, nums2, n) {
  let i = m - 1;
  let j = n - 1;
  //设置这个数组的指针
  let cur = m + n - 1;

  while (i >= 0 || j >= 0) {
    //  说明nums1元素已经插入完了
    if (i < 0) {
      nums1[cur--] = nums2[j--];
      //  说明nums2元素已经插入完了
    } else if (j < 0) {
      nums1[cur--] = nums1[i--];
    } else {
      // 比较大小,大的先放
      if (nums1[i] >= nums2[j]) {
        nums1[cur--] = nums1[i--];
      } else {
        nums1[cur--] = nums2[j--];
      }
    }
  }
};

/* 复杂度
时间 O(n+m)
空间 O(1)
*/

3.png

总结

这道题考察的如果通过迭代 双指针和原生的方法来 合并升序数组

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com