每天 3 分钟,走上算法的逆袭之路。

前文合集

每日一道 LeetCode 前文合集

代码仓库

GitHub: https://github.com/meteor1993/LeetCode

Gitee: https://gitee.com/inwsy/LeetCode

题目:合并两个有序数组

题目来源:https://leetcode-cn.com/problems/merge-sorted-array/

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

说明:

初始化 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]

解题方案

这道题单纯的从排序上来讲并不是难题,毕竟题目中已经给出来两个有序的数组了,最简单的循环一下长数组,然后挨个比较下两个数组元素的大小,放到一个新数组里面就完事儿了。

这道题的难点在于,我们需要在 nums1 数组中,完成两个数组的排序,这个就稍微有点坑了,这相当于要把 nums2 合并到 nums1 当中,还得要有序的合并进去。

这个弯有点难绕的,题目中虽然说最终的结果要在 nums1 当中,但是并没有说不允许我们创建第三个数组啊,我可以创建一个新的数组,把 nums1 copy 到新的数组中,然后再在 nums1 当中完成排序,这不也行么。

接下来就是代码时间,很简单,定义了两个指针,一个是 copy_nums1 的指针,还有一个是 nums2 的指针,通过移动这两个指针,来完成整个排序工作。

// 从前往后
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] copy_nums1 = new int[m];
System.arraycopy(nums1, 0, copy_nums1, 0, m); // copy_nums1 的指针
int n1 = 0;
// nums2 的指针
int n2 = 0;
// nums1 的指针
int n0 = 0; while ((n1 < m) && (n2 < n)) {
nums1[n0++] = copy_nums1[n1] < nums2[n2] ? copy_nums1[n1++] : nums2[n2++];
} if (n1 < m) {
System.arraycopy(copy_nums1, n1, nums1, n1 + n2, m + n - n1 - n2);
}
if (n2 < n) {
System.arraycopy(nums2, n2, nums1, n1 + n2, m + n - n1 - n2);
}
}

上面这种方案虽说能解决问题,但是有一点不大好,就是新建了一个数组,多占用了一个数组的空间,既然题上说 nums1 的长度足够上,我们从小到大排序不好排,那么如果是从大到小呢?

思路基本上还是一个思路,定义两个指针,然后倒序的将元素装到 nums1 里面。

// 从后往前
public void merge_1(int[] nums1, int m, int[] nums2, int n) {
// nums1 有数据的尾部指针
int n1 = m - 1;
// nums2 的尾部指针
int n2 = n - 1;
// nums1 最终的尾部指针
int n0 = m + n - 1; while ((n1 >= 0) && (n2 >= 0)) {
nums1[n0--] = nums1[n1] < nums2[n2] ? nums2[n2--] : nums1[n1--];
} System.arraycopy(nums2, 0, nums1, 0, n2 + 1);
}

今天这两道题都不难,基本上搞清楚了方案以后,就是写写代码练练手。

每日一道 LeetCode (19):合并两个有序数组的更多相关文章

  1. [LeetCode每日一题]88. 合并两个有序数组

    [LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ...

  2. Leetcode 88 合并两个有序数组 Python

    合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分 ...

  3. Java实现 LeetCode 88 合并两个有序数组

    88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...

  4. LeetCode 88. 合并两个有序数组

    题目: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...

  5. 领扣(LeetCode)合并两个有序数组 个人题解

    给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. ...

  6. LeetCode 88. 合并两个有序数组(Merge Sorted Array)

    题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...

  7. 【LeetCode】合并两个有序数组

    [问题] 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

  8. leetcode 88. C++ 合并两个有序数组

    Leetcode 88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 ...

  9. 【python】【补】Leetcode每日一题-合并两个有序数组

    [python]Leetcode每日一题-合并两个有序数组 [题目描述] 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 ...

随机推荐

  1. 查询MySQL数据库中表结构

    什么是表结构?表结构就是定义数据表文件名,确定数据表包含哪些字段,各字段的字段名.字段类型.及宽度,并将这些数据输入到计算机当中. 查询方法:以表‘employees’为例子 1.describe(d ...

  2. Pattern、Matcher的用法

    Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符 ...

  3. JavaScript Symbol对象

    JavaScript Symbol对象 Symbol Symbol对象是es6中新引进的一种数据类型,它的作用非常简单,就是用于防止属性名冲突而产生. Symbol的最大特点就是值是具有唯一性,这代表 ...

  4. Biopython 第三方库示例

    Biopython 第三方库示例 https://biopython-cn.readthedocs.io/zh_CN/latest/

  5. Hexo 静态博客指南:建站教程(中)

    本文最初发布于我的个人博客Bambrow's Blog,采用 BY-NC-SA 许可协议,转载请注明出处.若有后续更新,将更新于原博客.欢迎去我的博客阅读更多文章! 本文详细记录一下站点建立过程,以便 ...

  6. 教你在 Linux 下时光穿梭

    时光穿梭?电影里的桥段吧?良许你又在唬人? 非也非也,良许在这里要给大家介绍 touch 命令,有了它你就可以改变时间戳,达到时光穿梭的目的. touch 命令在我们的工作中使用也相当频繁,我们就由浅 ...

  7. CF掉分日记 6.6 6.8

    ---恢复内容开始--- 写的效果依旧不好 还没写完前四题比赛就结束了 而且这些普及组的题目 我大多还是缺少简单算法的灵性 总是把问题搞复杂化. 6.5 A 第一道题非常水 简单分析发现是一个快速幂的 ...

  8. MySQL一主多从配置和读写分离配置

    一.一主多从配置 此次操作实现的是一主两从的方式.主服务器slave2(2.100),从服务器slave2-1(2.107),slave2-2(2.108);第一:准备主数据库    1. 在不同的机 ...

  9. day12. 闭包

    一.概念 """ 如果内函数使用了外函数的局部变量, 并且外函数把内函数返回出来的过程,叫做闭包 里面的内函数是闭包函数 """ 二.基本语 ...

  10. day9.关于文件的操作

    一.文件操作 """ fp = open("文件名",mode="模式",encoding="utf-8") ...