专栏首页灵魂画师牧码画解算法:88. 合并两个有序数组

画解算法:88. 合并两个有序数组

题目链接

https://leetcode-cn.com/problems/merge-sorted-array/

题目描述

给定两个有序整数数组 nums1nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1nums2 的元素数量分别为 mn
  • 你可以假设 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]

解题方案

思路

  • 标签:从后向前数组遍历
  • 因为nums1的空间都集中在后面,所以从后向前处理排序的数据会更好,节省空间,一边遍历一边将值填充进去
  • 设置指针len1len2分别指向nums1nums2的有数字尾部,从尾部值开始比较遍历,同时设置指针len指向nums1的最末尾,每次遍历比较值大小之后,则进行填充
  • len1<0时遍历结束,此时nums2中海油数据未拷贝完全,将其直接拷贝到nums1的前面,最后得到结果数组
  • 时间复杂度:O(m+n)

代码

  • Java版本
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int len1 = m - 1;
        int len2 = n - 1;
        int len = m + n - 1;
        while(len1 >= 0 && len2 >= 0) {
            // 注意--符号在后面,表示先进行计算再减1,这种缩写缩短了代码
            nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
        }
        // 表示将nums2数组从下标0位置开始,拷贝到nums1数组中,从下标0位置开始,长度为len2+1
        System.arraycopy(nums2, 0, nums1, 0, len2 + 1);
    }
}
  • JavaScript版本
/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    let len1 = m - 1;
    let len2 = n - 1;
    let len = m + n - 1;
    while(len1 >= 0 && len2 >= 0) {
        // 注意--符号在后面,表示先进行计算再减1,这种缩写缩短了代码
        nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
    }
    function arrayCopy(src, srcIndex, dest, destIndex, length) {
        dest.splice(destIndex, length, ...src.slice(srcIndex, srcIndex + length));
    }
    // 表示将nums2数组从下标0位置开始,拷贝到nums1数组中,从下标0位置开始,长度为len2+1
    arrayCopy(nums2, 0, nums1, 0, len2 + 1);
};

画解

本文分享自微信公众号 - 牧码啦(mumalo),作者:灵魂画师牧码

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​画解算法:100. 相同的树

    https://leetcode-cn.com/problems/same-tree/

    灵魂画师牧码
  • 画解算法:136. 只出现一次的数字

    https://leetcode-cn.com/problems/single-number/

    灵魂画师牧码
  • 天天算法 LeetCode-216-组合总和 III

    https://leetcode-cn.com/problems/combination-sum-iii/

    灵魂画师牧码
  • leetcode-88-Merge Sorted Array

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one s...

    chenjx85
  • leetcode-350-Intersection of Two Arrays II(求两个数组的交集)

    Given two arrays, write a function to compute their intersection.

    chenjx85
  • 【LeetCode题解-004】Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively.

    周三不加班
  • 【每天一道编程系列-2018.2.18】(Ans)

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find ...

    yesr
  • leetcode 4 Median of Two Sorted Arrays

    @坤的
  • 【leetcode刷题】T43-两个数组的交集

    Given two arrays, write a function to compute their intersection.

    木又AI帮
  • [LeetCode]Merge Sorted Array 合并排序数组 [LeetCode]Merge Sorted Array 合并排序数组

    链接:https://leetcode.com/problems/merge-sorted-array/description/ 难度:Easy 题目:88...

    尾尾部落

扫码关注云+社区

领取腾讯云代金券