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

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

你们好今天给你们分享下一道 LeetCode 简单难度 的题目合并两个有序数组前端

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。java

初始化 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个都为有序数组markdown

2.num1.len = m+n网络

3.合并到num1上去app

解法ide

1.迭代oop

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;

  // 由于nums1的0是占位符,能够先移除
  nums1 = nums1.slice(0, m - n);

  // 先迭代这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

相关文章
相关标签/搜索