每日一道 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 成为一个有序数组 ...
随机推荐
- 五分钟带你深入了解Redis
相信phper都知道Redis是什么,既然如此,为表仪式感,首先我还是得说说什么是Redis. Redis是什么 redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是 ...
- Linux系统查看硬件信息神器,比设备管理器好用100倍!
大家都知道,当我们的 Linux 系统计算机出现问题时,需要对其排除故障,首先需要做的是找出计算机的硬件信息.下面介绍一个简单易用的应用程序--HardInfo,你可以利用它来显示你电脑的每个硬件方面 ...
- SUCTF2019-web Easyweb
<?php function get_the_flag(){ // webadmin will remove your upload file every 20 min!!!! $userdir ...
- 读懂操作系统之快表(TLB)原理(七)
前言 前不久.我们详细分析了TLB基本原理,本节我们通过一个简单的示例再次叙述TLB的算法和原理,希望借此示例能加深我们对TLB(又称之为快表,深入理解计算机系统(第三版)又称之为翻译后备缓冲区)的理 ...
- ubuntu 12.04无盘工作站
注释:该篇博文是借鉴下列文章加上自己实践总结得来: a. http://forum.ubuntu.org.cn/viewtopic.php?f=77&t=117754 b. http://bl ...
- python线程,进程,队列和缓存
一.线程 threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 创建线程的两种方式1.threading.Thread import threading def f1(arg): ...
- Centos 7下编译安装PHP7.2(与Nginx搭配的安装方式)
一.下载源码包 百度云网盘下载地址:https://pan.baidu.com/s/1li4oD3qjvFyIaEZQt2NVRg 提取码:4yde 二.安装php依赖组件 yum -y instal ...
- LQB2013A05前缀判断
上一道题,,,把if条件写错了,,,,找了半天的bug我都快哭了, 好了好了 看见这种填空题,先理解题意 然后把代码copy下来,把空格注释掉,然后运行到编译没有错. 再理一下它的思路 // // C ...
- MySQL数据库常见命令
数据库的操作 MySQL服务器的常见命令 开启:sudo service mysql start关闭:sudo service mysql stop重启:sudo service mysql rest ...
- 求100以内所有奇数的和,存于字变量X中。
问题 求100以内所有奇数的和,存于字变量X中. 代码 data segment x dw ? data ends stack segment stack db 100 dup(?) stack en ...