LeetCode-Java:88合并两个有序数组
题目:
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 [] 。
合并结果是 [1] 。
示例 3:
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1] 。
合并结果是 [1] 。
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。
提示:
nums1.length == m + nnums2.length == n0 <= m, n <= 2001 <= m + n <= 200-109 <= nums1[i], nums2[j] <= 109
进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?
解:
① 解题思路:先将数组2放到数组1后半部分,再对数组1进行冒泡排序。时间复杂度:O(n+(m+n)方)
// 题目:给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n
// 分别表示 nums1 和 nums2 中的元素数目
// 请你合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
//
// 注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。
// 为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。
// nums2 的长度为 n 。
class Solution {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
// 合并nums1、nums2,m,n分别代表对应数组的元素数目
// 先将数组2放到数组1后半部分,时间复杂度O(n)
for (int i = m; i < m + n; i++) {
nums1[i] = nums2[i - m];
}
// 对数组1进行冒泡排序,时间复杂度O((m+n)方)
for (int i = 0; i < m + n - 1; i++) {
for (int j = i + 1; j < m + n; j++) {
int temp;
if (nums1[i] > nums1[j]) {
temp = nums1[i];
nums1[i] = nums1[j];
nums1[j] = temp;
}
}
}
}
public static void main(String[] args) {
// 数组的两种初始化方式
int[] nums1 = {4, 2, 3, 0, 0, 0};
int[] nums2 = new int[]{2, 5, 6};
merge(nums1, nums1.length - nums2.length, nums2, nums2.length);
// 打印合并后数组
for (int i = 0; i < nums1.length; i++) {
System.out.print(nums1[i] + " ");
}
}
}
两个知识点补充:
非递减排列:数列递减,但里面的元素可以重复出现
1,2,3:递增排列
3,2,1:递减排列
1,1,2,3,3,3:非递减排列
3,3,2,1,1 : 非递增排列Java数组初始化:两种初始化方式如下
int[] nums1 = {4, 2, 3, 0, 0, 0}; int[] nums2 = new int[]{2, 5, 6};
② 解题思路:对①的冒泡进行修改,换成调用函数排序
import java.util.Arrays;
class Solution {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
// 合并nums1、nums2,m,n分别代表对应数组的元素数目
// 先将数组2放到数组1后半部分,时间复杂度O(n)
for (int i = m; i < m + n; i++) {
nums1[i] = nums2[i - m];
}
// **调用函数排序数组**
Arrays.sort(nums1);
}
public static void main(String[] args) {
// 数组的两种初始化方式
int[] nums1 = {4, 2, 3, 0, 0, 0};
int[] nums2 = new int[]{2, 5, 6};
merge(nums1, nums1.length - nums2.length, nums2, nums2.length);
}
}
③ 解题思路:双指针,利用数组 nums1与 nums2已经被排序的性质,时间复杂度是O(m+n),空间复杂度
import java.util.Arrays;
class Solution {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
// 合并nums1、nums2,m,n分别代表对应数组的元素数目
int p1 = 0, p2 = 0; // 双指针,分别指向当前排序的nums1、nums2的位置
int[] num = new int[m + n];
for (int i = 0; i < m + n; i++) {
if(p1 == m){ //nums1已经用完啦
num[i]=nums2[p2++];
continue;
}
if(p2 == n){ //nums2已经用完啦
num[i]=nums1[p1++];
continue;
}
if (nums1[p1] < nums2[p2]) {
num[i] = nums1[p1++];
} else {
num[i] = nums2[p2++];
}
}
System.arraycopy(num, 0, nums1, 0, nums1.length); //排序后num赋值给nums1
}
public static void main(String[] args) {
// 数组的两种初始化方式
int[] nums1 = {1, 2, 3, 0, 0, 0};
int[] nums2 = new int[]{2, 5, 6};
merge(nums1, nums1.length - nums2.length, nums2, nums2.length);
// 打印合并后数组
for (int i = 0; i < nums1.length; i++) {
System.out.print(nums1[i] + " ");
}
}
}
④ 解题思路:逆双指针,③的改进,因为nums1后部分为0,为了节省空间,可以不用新建num,直接对nums1从后往前进行插入
class Solution {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
// 合并nums1、nums2,m,n分别代表对应数组的元素数目
int p1 = m - 1, p2 = n - 1; // 逆双指针,分别指向当前排序的nums1、nums2最后的位置
for (int i = m + n - 1; i >= 0; i--) {
if (p1 == -1) { //如果p1用完啦
nums1[i] = nums2[p2--];
continue;
}
if (p2 == -1) { //如果p2用完啦
nums1[i] = nums1[p1--];
continue;
}
if (nums1[p1] > nums2[p2]) {
nums1[i] = nums1[p1--];
} else {
nums1[i] = nums2[p2--];
}
}
}
public static void main(String[] args) {
// 数组的两种初始化方式
int[] nums1 = {1, 2, 3, 0, 0, 0};
int[] nums2 = new int[]{2, 5, 6};
merge(nums1, nums1.length - nums2.length, nums2, nums2.length);
// 打印合并后数组
for (int i = 0; i < nums1.length; i++) {
System.out.print(nums1[i] + " ");
}
}
}
总结
以上分别是读题之后的写法,了解解题思路之后的实现情况。
本题较为简单,但花费时间还是有点多,对java的函数和一些基础使用方法还是不够熟悉,中间还出现了一些数组越界的问题。
除了最后一种方法,应该还有其他的更便捷的解题思路,下次再看这题的话希望能有新的思路。
LeetCode-Java:88合并两个有序数组的更多相关文章
- 【LeetCode】88. 合并两个有序数组
88. 合并两个有序数组 知识点:数组:排序:双指针: 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 ...
- leetcode.双指针.88合并两个有序数组-Java
1. 具体题目 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别 ...
- LeetCode【88. 合并两个有序数组】
首先想到的方法就是,假设一个nums3数组,然后,比较nums1与nums2的数值大小,然后,放在nums3中,再将nums3转移到nums1中. 实现起来很麻烦,1.没有考虑到下标问题,结果就Arr ...
- Java实现 LeetCode 88 合并两个有序数组
88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...
- [LeetCode每日一题]88. 合并两个有序数组
[LeetCode每日一题]88. 合并两个有序数组 问题 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 初始化 n ...
- LeetCode系列之 (JavaScript) => 88. 合并两个有序数组
题目描述: [Leetcode 题目链接]:88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com) 解题思路分析: 在nums1中找到nums2 插入的位置,然后在 ...
- 每日一道 LeetCode (19):合并两个有序数组
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- Leetcode 88 合并两个有序数组 Python
合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分 ...
- LeetCode 88. 合并两个有序数组
题目: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- LeetCode 88. 合并两个有序数组(Merge Sorted Array)
题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
随机推荐
- 记一次 .NET某培训学校系统 内存碎片化分析
一:背景 1. 讲故事 前些天有位朋友微信上找到我,说他们学校的Web系统内存一直下不去,让我看下到底是怎么回事,老规矩让朋友生成一个dump文件丢给我,看一下便知. 二:WinDbg 分析 1. 托 ...
- 为react项目添加开发/提交规范(前端工程化、eslint、prettier、husky、commitlint、stylelint)
因历史遗留原因,接手的项目没有代码提醒/格式化,包括 eslint.pretttier,也没有 commit 提交校验,如 husky.commitlint.stylelint,与其期待自己或者同事的 ...
- cdn 引入的资源需要通过 externals 排除打包哦~
cdn 指的是通过相互连接的网络系统,使用最靠近用户的服务器将音乐.图片等资源以高效率和低成本的方式将内容传递给用户. 在 webpack 中,我们可能会将引入的第三方资源会编译成单独的文件,作为静态 ...
- zookeeper运维常用指令
zkServer.sh ./zkServer.sh start:启动zookeeper ./zkServer.sh stop:停止zookeeper ./zkServer.sh status:查看zo ...
- Jenkins远程执行shell脚本,超时报错(ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,001 ms])
通过Jenkins远程执行脚本时,发现Jenkins构建任务失败,但是服务器本身的脚本是生效的. 排查确认是Jenkins构建任务超时,导致Jenkins看板显示任务构建失败,但是服务器上的自动脚本执 ...
- ❤️ GitHub Copilot 读心术揭秘,Copilot 逆向工程笔记
总览 你是否好奇 GitHub Copilot 如何知道你想写的内容?有时候它聪明得甚至好像读过你项目里其他文件一样,不要怀疑,它确实读过.这篇文章记录了我阅读一个对 Copilot 的逆向工程的笔记 ...
- Win11+ VS2022编译 FFmpeg6.0 静态库
目录 编译前言 为什么项目编译? 前期准备 环境配置 ffmpeg外部库 额外的编译选项-for渲染 opengl (需要glext) ffnvcodec (需要nv-codec-headers) A ...
- 《代码整洁之道 Clean Code》学习笔记 Part 1
前段时间在看<架构整洁之道>,里面提到了:构建一个好的软件系统,应该从写整洁代码做起.毕竟,如果建筑使用的砖头质量不佳,再好的架构也无法造就高质量的建筑.趁热打铁,翻出<代码整洁之道 ...
- [Lua][Love Engine] 打砖块游戏实现过程与知识点
本文旨在根据LOVE2D官方文档和教程实现打砖块的游戏,记录部分实现过程和重要知识点 目标摧毁所有砖块 玩家控制球拍左右滑动反弹小球 小球摧毁砖块 小球保持在屏幕内 小球碰到屏幕底部,GAME OVE ...
- VulnStack - ATT&CK红队评估实战(四) Writeup
VulnStack - ATT&CK红队评估实战(四) Writeup VulnStack(四)环境搭建 1.项目地址 http://vulnstack.qiyuanxuetang.net/v ...