LeetCode题练习与总结:合并两个有序数组--88

2024-05-08 01:36

本文主要是介绍LeetCode题练习与总结:合并两个有序数组--88,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述

给你两个按 非递减顺序 排列的整数数组 nums1 nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 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 + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -10^9 <= nums1[i], nums2[j] <= 10^9

二、解题思路

1. 初始化指针

  • p1:指向 nums1 的有效元素末尾,初始值为 m - 1
  • p2:指向 nums2 的末尾,初始值为 n - 1
  • p:指向 nums1 的末尾,即合并后数组的末尾,初始值为 m + n - 1

2. 比较并合并

  • 当 p1 >= 0 且 p2 >= 0 时,比较 nums1[p1] 和 nums2[p2]
  • 将较大的元素复制到 nums1[p] 的位置,并将相应的指针向前移动一位(即 p--p1-- 或 p2--)。

3. 处理剩余元素

  • 如果 nums1 的所有元素已经合并完成(即 p1 < 0),而 nums2 还有剩余元素,直接将 nums2 的剩余元素复制到 nums1 的前端。
  • 由于 nums1 的前 m 个元素已经是排好序的,且 nums1 的长度是 m + n,所以不需要单独处理 nums1 剩余的元素。

4. 结束条件

  • 当 p2 < 0 时,表示 nums2 的所有元素已经合并完成,此时合并过程结束。

通过以上步骤,可以在不使用额外空间的情况下,将 nums2 合并到 nums1 中,并且保证合并后的数组仍然有序。

三、具体代码

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = m - 1; // nums1的有效元素末尾int p2 = n - 1; // nums2的末尾int p = m + n - 1; // nums1的末尾// 从后往前遍历,比较并填充nums1while (p1 >= 0 && p2 >= 0) {nums1[p--] = (nums1[p1] > nums2[p2]) ? nums1[p1--] : nums2[p2--];}// 如果nums2还有剩余元素,直接复制到nums1的前端while (p2 >= 0) {nums1[p--] = nums2[p2--];}}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 该算法的主要时间消耗在于遍历两个数组中的元素,并进行比较和复制操作。
  • while 循环会执行 m + n 次,因为每次循环都会将一个元素放到最终位置,直到所有元素都被放置完毕。
  • 因此,时间复杂度为 O(m + n)。
2. 空间复杂度
  • 该算法没有使用额外的数组空间,只是使用了几个额外的变量来存储指针位置。
  • 变量 p1p2 和 p 占用的空间是常数级别的,与输入数组的大小无关。
  • 因此,空间复杂度为 O(1),即常数空间复杂度。

综上所述,该算法的时间复杂度为 O(m + n),空间复杂度为 O(1)。

五、总结知识点

1. 数组的操作

  • 通过索引访问数组元素:nums1[p1] 和 nums2[p2]
  • 通过索引修改数组元素:nums1[p] = nums1[p1] 或 nums1[p] = nums2[p2]

2. 指针的概念

  • 使用指针(即索引变量)来跟踪数组中的位置。在这里,p1p2 和 p 都是指针,它们表示当前正在比较或复制的元素的位置。

3. 循环结构

  • 使用 while 循环来重复执行比较和复制操作,直到所有元素都被处理。

4. 条件语句

  • 使用条件语句(if-else 的三元操作符形式)来决定哪个元素应该被复制到 nums1 的当前位置。

5. 自减运算符

  • 使用自减运算符 -- 来将指针向前移动,即从数组的末尾向开始位置移动。

6. 数组合并的逻辑

  • 从两个数组的末尾开始比较,将较大的元素逐个移动到 nums1 的末尾,这样可以避免使用额外的空间,并且能够保持元素的顺序。

7. 数组的长度和索引

  • 数组的长度是从 0 开始的,所以数组的最后一个元素的索引是 length - 1

8. 边界条件的处理

  • 当 p1 或 p2 小于 0 时,表示一个数组已经处理完毕,只需要将另一个数组的剩余元素复制到 nums1 中。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

这篇关于LeetCode题练习与总结:合并两个有序数组--88的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968947

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu