每日一道 LeetCode (19):合并两个有序数组

每天 3 分钟,走上算法的逆袭之路。
前文合集
代码仓库
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):合并两个有序数组的更多相关文章
- [LeetCode每日一题]88. 合并两个有序数组
		[LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ... 
- Leetcode 88 合并两个有序数组 Python
		合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分 ... 
- Java实现 LeetCode 88 合并两个有序数组
		88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ... 
- LeetCode 88. 合并两个有序数组
		题目: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ... 
- 领扣(LeetCode)合并两个有序数组 个人题解
		给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. ... 
- LeetCode 88. 合并两个有序数组(Merge Sorted Array)
		题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ... 
- 【LeetCode】合并两个有序数组
		[问题] 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ... 
- leetcode 88. C++ 合并两个有序数组
		Leetcode 88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 ... 
- 【python】【补】Leetcode每日一题-合并两个有序数组
		[python]Leetcode每日一题-合并两个有序数组 [题目描述] 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组 ... 
随机推荐
- SQL 给某字段添加汉字却显示??
			错误展示: 解决方案: 1.在要修改的数据库上单击鼠标右键,并选择“属性”. 2.在弹出的数据库属性窗口中点击“选择页”中的“选项”. 3.将排序规则由默认的SQL_Latin1_Genera ... 
- Python协程之Gevent模块
			背景 进程是操作系统分配资源的最小单位,每个进程独享4G的内存地址空间,因此进程内数据是安全的,检查间的通信需要使用特定的方法.同理,正是因为进程是数据安全的,所以导致进程的切换是一个很麻烦效率不高的 ... 
- Elasticsearch源码解析:环境搭建
			在之前学习Redis的过程中,我就是一边通过文档/视频学习,一边阅读源码.我发现两种方法可以相辅相成,互相补充.阅读文档可以帮助我们快速了解某个功能,阅读源码有助于我们更深入的理解这一功能的实现及思想 ... 
- wpf文字模糊
			wpf如果使用了DropShadowEffect,会导致文字模糊,可以在window上设置 this.UseLayoutRounding = true;解决此问题 
- [leetcode/lintcode 题解] 微软面试题:股票价格跨度
			编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度. 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天). 例如 ... 
- Oracle整合Mybatis实现list数据插入时,存在就更新,不存在就插入以及随机抽取一条记录
			作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 Oracle整合Mybatis实现list数据插入时,存在就更新,不存在就插入 entity 对应表中字段,如不对应,在xml中起别名 map ... 
- netcore RabbitMQ入门--win10开发环境
			安装 1.进入rabbitMQ官网下载安装包 2.点击安装包安装的时候会提示需要先装erlang 点击是会自动跳转到erlang的下载界面如果没有跳转可以直接点击这里下载,根据系统选择下载包 下载完之 ... 
- SQL语法入门
			SQL语句概述 ·SQL定义:是一种特定目的编程语言,用于管理关系数据库 ·GaussDB T是一种关系数据库,SQL语句包括 1.DDL 数据定义语言,用于定义或修改数据库中的对象(表,视图,序列, ... 
- 前端学习(三):body标签(一)
			进击のpython ***** 前端学习--body标签 body中的相关标签,因为是主要展现在页面的内容区域 所以相对来说内容多,杂,要背记的部分很多 当学完这节的内容之后,你可以试着写一片精致的文 ... 
- java 控制语句、数组、方法
			一.控制语句 1.if 语句 if语句是指如果满足某种条件,就进行某种处理. 流程图: 2. if…else语句 语法格式: if (判断条件){ 执行语句1 …… }else{ 执行语句2 …… } ... 
