力扣面试经典算法150题:合并两个有序数组

embedded/2024/10/15 5:40:47/

算法

本篇开始,正式进入算法刷题篇。

题目来源于力扣面试经典150题。

题目链接:https://leetcode.cn/studyplan/top-interview-150/

合并两个有序数组

题目选自150题中的数组/字符串一类,题目难度:简单。

题目描述

给定两个按非递减顺序排列的整数数组 nums1nums2,以及两个整数 mn,分别代表 nums1nums2 中的实际元素数量。将 nums2 中的所有元素合并到 nums1 中,使得 nums1 成为一个有序数组。

  • 注意:
    • 数组 nums1 的长度等于 m + n,意味着它有足够的空间容纳 nums2 中的所有元素。
    • 不要使用额外的数组空间,你应该在原地修改输入数组并在使用 O(1) 额外空间的条件下完成此操作。
  • 示例:
    • 输入:
      nums1 = [1,2,3,0,0,0], m = 3
      nums2 = [2,5,6], n = 3
    • 输出:
      nums1 = [1,2,2,3,5,6]
  • 解释:
    • 数组 nums1 的前 m 个元素 [1,2,3] 是已排序的。
    • 数组 nums2 的所有元素 [2,5,6] 也是已排序的。
    • 合并后,nums1 应该包含 [1,2,2,3,5,6],并且仍然保持有序状态。

题目分析

题目要求我们在不使用额外空间的情况下,将两个已排序的数组合并成一个新的有序数组。

由于 nums1 已经预留了足够的空间来存放 nums2 中的元素,因此我们可以通过某种方式直接在 nums1 上进行操作。

为了保证合并后的数组仍然有序,我们需要找到一种方法,能够确保较大的元素被放置在数组的后面,较小的元素被放置在前面。对于这种数组的排序算法,如果是递增排序(从小到大),我们采取从数组尾部开始比较元素并放置;反之如果是递减排序(从大到小),我们就采取从数组头部开始进行元素的比较与放置。

解题思路

  1. 递增排序的数组,我们从尾部开始比较与放置元素,所以我们需要定义出三个变量,分别作为nums1nums2nums1(合并后)数组的最大索引值。
  2. 很明显算法必须必须使用循环语句实现,那么循环条件必须是能同时拿到两个初始数组的元素才能进行循环,因为两个数组的元素需要作比较。
  3. 算法的核心内容也就是循环语句中的内容是对两个数组的元素大小比较,将大的值放入到合成后的数组中,就是nums1
  4. 由于两个数组长度不等,可能存在一个数组元素取完,另一个元素未取完的场景,因此我们需要对长度较长的数组单独做一次循环,直接较长的数组的元素也取完。在本题中,由于两数组合并到nums1数组,所以nums1的长度是大于nums2的长度。注意这里指的是长度,而不是实际的元素个数。

实际算法代码

根据以上分析和思路,我们可以写出以下代码:

java">    public static void main(String[] args) {// 示例数据int[] nums1 = {1, 2, 3, 0, 0, 0};int m = 3;int[] nums2 = {2, 5, 6};int n = 3;// 调用合并方法merge(nums1, m, nums2, n);// 输出合并后的数组System.out.println(Arrays.toString(nums1));}/*** 合并两个有序数组** @param nums1 第一个有序数组* @param m     nums1 中实际元素的数量* @param nums2 第二个有序数组* @param n     nums2 中实际元素的数量*/private static void merge(int[] nums1, int m, int[] nums2, int n) {// nums1 的最后一个实际元素的索引int i = m - 1; // nums2 的最后一个元素的索引int j = n - 1; // 合并后数组的最后一个位置的索引int k = m + n - 1; // 从后向前比较和放置元素while (i >= 0 && j >= 0) {// 取较大的元素放入合并后的数组中,并且注意k的值要减1,因为我们是从尾部开始处理,要往上一个位置放元素// 被取出元素的数组索引要减1,下次取的时候就是上一个位置元素if (nums1[i] > nums2[j]) {nums1[k] = nums1[i];k--;i--;} else {nums1[k] = nums2[j];k--;j--;}}// 如果 nums2 还有剩余元素,则将其复制到 nums1 的前面// 解题思路4while (j >= 0) {nums1[k] = nums2[j];k--;j--;}}

验证

算法编码编写完毕,进行验证。启动main函数,效果如下:

在这里插入图片描述

力扣执行:

在这里插入图片描述

完美通过!


http://www.ppmy.cn/embedded/90871.html

相关文章

mysql+php+html实现学生管理系统

mysqlphphtml实现学生管理系统 前言 本文使用Mysqlphphtml实现一个简单的学生管理系统,实现了登陆,注册,总览学生信息,添加学生,查询特定的学生,删除指定的学生等功能。并且本文仅用来学习就够了&#xf…

一文讲透出海短剧2024营销白皮书

霸总心尖宠?废柴逆袭打脸?校草F4雄竞?你以为这是国内抖音、快手吗?不。这是海外最近正火的短剧内容!根据《2024年短剧出海营销白皮书》,国内“土味”短剧已经走向国际,成为全球观众的新宠。 而美…

Phalco安装过程以及踩的一些坑(mac环境)

一 背景 公司用Phalcon框架好长时间了,中途发现了一些Phalcon使用的上的问题,于是想在本地搭建一套Phalcon的环境,方便排查问题使用。 二 Mac系统下的安装 看了很多说法,最终发现还是官网给力,安装Phalcon使用下列命令即可(前提条件是PHP已安装好,工具pecl也安装好了):…

el-button鼠标悬浮时显示按钮,鼠标移开隐藏

在 Element UI 中,el-button 组件本身并不直接支持鼠标悬浮时显示、鼠标移开时隐藏的功能,因为这种需求更偏向于显示隐藏控制,而不是按钮的固有属性。不过,你可以通过结合 CSS 和 Vue 的条件渲染(虽然在这个场景下可能…

电线电缆测厚双测径仪联控测厚系统

关键字:线缆测厚系统,绝缘层测厚设备,电线皮套测厚,电缆绝缘层测厚, 产品简介: 双测径仪联控测厚系统的工作原理基于光电测量技术。一台测径仪测量电缆的成品直径,另一台测径仪测量线芯的直径。通过这些测量数据,系统计算出绝缘层或护套层的厚…

XHTML 简介

XHTML 简介 XHTML,即“可扩展超文本标记语言”(eXtensible HyperText Markup Language),是一种基于XML的标记语言,旨在取代HTML作为网页内容的标准格式。XHTML继承了HTML的许多特性,但更加严格和规范,要求文档结构更加严谨,标签和属性必须正确嵌套和闭合。这种严格性使…

零基础小白备考PMP需要多长时间?

PMP考试在中国大陆,平均每三个月安排一次考试。报名缴费一般在考试前两个月,报完名后开始进入备考,所以基本上是2-3个月的时间。 PMP考试备考不是越久越好,把备考战线拉得太长 ,我们的精力都是有限的,后期…

git把本地文件上传远程仓库的流程

下载git,并创建一个仓库,这里着重介绍怎么把本地文件上传参考 正确执行步骤:在你需要上传的文件夹空白处下,右键鼠标,点击git bash here $ git init初始化当前目录 $ git status看一下当前分支里面有什么&#xff0c…