leetcode第88题入口

题目描述

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。


示例 :


输入: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] 。

解法一:暴力破解

Java代码1

import java.util.*;
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int len = m+n;
for(int i=m;i<len;i++){
nums1[i] = nums2[i-m];
}
Arrays.sort(nums1);
}
}

数组拷贝

也可以使用System.arraycopy方法

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

参数分别代表源数组,源数组起始索引,目标数组,目标数组位置,元素个数

System.arraycopy图解

Java代码2

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2,0,nums1,m,n);
Arrays.sort(nums1);
}
}

复杂度分析

没有用到连个数组正序的条件,复杂度取决于排序算法。

时间复杂度:O((m+n)log(m+n))

空间复杂度:O(1)


解法二:双指针 (从前往后)

指针起始位置图解

Java代码

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums1_copy = new int[m];
System.arraycopy(nums1,0,nums1_copy,0,m);
int p1 = 0;
int p2 = 0; int p = 0;
while(p1<m && p2<n){
nums1[p++] = nums1_copy[p1]>nums2[p2]?nums2[p2++]:nums1_copy[p1++];
}
if(p1<m){
System.arraycopy(nums1_copy,p1,nums1,p,m-p1);
}
if(p2<n){
System.arraycopy(nums2,p2,nums1,p,n-p2);
}
}
}

复杂度分析

利用到了两数组有序的条件

时间复杂度:O(m+n)

空间复杂度:O(m)


解法三:双指针(从后往前)

空闲空间的利用:因为数组1有足够的空间放置所有合并后的数据,我们可以利用当前数组1中空闲的空间,节省解法二中额外数组拷贝的空间。

双指针起始位置图解

Java代码

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m-1;
int p2 = n-1; int p = n+m-1;
while(p1>=0 || p2>=0){
nums1[p--] = p1>=0 && (p2 < 0 || nums1[p1]>nums2[p2])?nums1[p1--]: nums2[p2--];
} }
}

复杂度分析

利用到了两数组有序的条件,并且利用了数组1的空闲空间,没有开辟新内存;

时间复杂度:O(m+n)

空间复杂度:O(1)

[每日算法] leetcode第88题:合并两个有序数组的更多相关文章

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

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

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

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

  3. leetcode第四题:两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2  ...

  4. Leetcode 88:合并两个有序数组

    Leetcode链接 : https://leetcode-cn.com/problems/merge-sorted-array/ 问题描述: 给定两个有序整数数组 nums1 和 nums2,将 n ...

  5. 【leetcode 简单】第二十题 合并两个有序数组

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

  6. python3实现合并两个有序数组

    很早就听同学和师兄经常说刷题很重要,然而编程能力一直都很渣的我最近才开始从leetcode的初级算法开始.今天遇到的这道题虽然很简单,因为是头一次用自己的方法速度还不错,特此记录一下,还大神们请不要嘲 ...

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

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

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

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  9. LeetCode系列之 (JavaScript) => 88. 合并两个有序数组

    题目描述: [Leetcode 题目链接]:88. 合并两个有序数组 - 力扣(LeetCode) (leetcode-cn.com) 解题思路分析: 在nums1中找到nums2 插入的位置,然后在 ...

  10. Leetcode#88. Merge Sorted Array(合并两个有序数组)

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

随机推荐

  1. 万字长文:手把手教你实现一套高效的IM长连接自适应心跳保活机制

    本文作者"Carson",现就职于腾讯公司,原题"高效保活长连接:手把手教你实现自适应的心跳保活机制",有较多修订和改动. 1.引言 当要实现IM即时通讯聊天. ...

  2. Jetbrains fleet 配置 C++开发环境(基于CMAKE和MinGW)

    Jetbrains fleet 配置 C++开发环境 1. 安装 Jetbrains Fleet 到Fleet下载页面下载Toolbox并安装 Jetbrains-Fleet下载页 安装完成后在任务栏 ...

  3. org.junit.Assert

    引入包,以下两种方式都是OK的,看个人喜好,我倾向于使用第二种,会更加清晰直观.下面的代码我都会用第二种 import static org.junit.Assert.*; import org.ju ...

  4. python 控制流程

    条件语句 if语法 if True: print("hello") print("world!") 输出: helloworld! 举例: "&quo ...

  5. 某次信创环境Oceanbase数据库偶发乱码问题

    资料迁移,整理分享. 问题发生在2023年 一.环境介绍及问题简述 数据库 oceanbase 操作系统 Linux (麒麟) WEB中间件 Tongweb 数据库表编码 GBK 中间件默认使用的HT ...

  6. 凸n边形的对角线最多能将其内部分成几个区域

    https://math.stackexchange.com/questions/3384251/into-how-many-regions-do-the-sides-and-diagonals-of ...

  7. delphi cxgrid保存正在编辑的行

    procedure SaveGridViewEditing(AView: TcxGridDBTableView); overload; var vDst: TDataSet; begin // 应用未 ...

  8. 【译】.NET 升级助手现在支持升级到集中式包管理

    原文 | McKenna Barlow 翻译 | 郑子铭 最近,.NET 升级助手引入了一些有用的新功能和一种新的中央包管理 (CPM) 升级类型. .NET 升级助手可帮助您将解决方案升级到较新版本 ...

  9. Vue获取DOM,数据监听,组件,混合和插槽

    Vue获取DOM,数据监听,组件,混合和插槽 注:":" 是指令 "v-bind"的缩写,"@"是指令"v-on"的缩写 ...

  10. Project Euler 638 题解

    q-analog,老玩家集体起立! 这也就是说: \[\binom{n+m}{n}_q=\sum_{\pi\in L_{n,m}}q^{area(\pi)} \] 结束! #include<bi ...