【数据结构】LeetCode移除元素、删除排序数组中的重复项、合并两个有序数组

news2024/11/15 23:29:05

目录

        一、移除元素

               1、题目说明

               2、题目解析

        二、删除排序数组中的重复项

               1、题目说明

               2、题目解析

        三、合并两个有序数组

               1、题目说明

               2、题目解析


一、移除元素

  1、题目说明

题目链接:移除元素

给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

要求:时间复杂度为O(N),空间复杂度为O(1)。

示例1:

输入:nums = [3,2,2,3], val = 3

输出:2,,nums = [2,2]

解释:函数应该返回新的长度2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2

输出:5, nums = [0,1,4,0,3]

解释:函数应该返回新的长度 5,并且 nums 中的前五个元素为 01,3, 04。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

  2、题目解析

思路:

在原来的数组中移动数据,首先要创建src和dst两个变量,如果nums[src] == val时,src++,否则,当nums[dst] = nums[src] 时,dst++和src++。

int removeElement(int* nums, int numsSize, int val) 
{
    int src = 0, dst = 0;
    while (src < numsSize)
    {
        if (nums[src] == val)
        {
            src++;
        }
        else
        {
            nums[dst] = nums[src];
            dst++;
            src++;
        }
    }
    return dst;
}

二、删除排序数组中的重复项

  1、题目说明

题目链接: 删除排序数组中的重复项

给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度,圆的相对顺序应该保持一致。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组 nums 的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。

示例1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

1 <= nums.length <= 3 * 10^{4}
-10^{4} <= nums[i] <= 10^{4}
nums 已按升序排列

  2、题目解析

这道题和上道题是类似的,不同是需要保留一个数字,如下图所示,如果当nums[src] == nums[dst]时,只用src往后移动一位,如果nums[src] != nums[dst]时,dst需要先往后移动一位,然后将src的数据赋给dst,最后src在往后移,直到结尾。

int removeDuplicates(int* nums, int numsSize) 
{
    int src = 0, dst = 0;
    while (src < numsSize)
    {
        if (nums[src] == nums[dst])
        {
            src++;
        }
        else
        {
            dst++;
            nums[dst] = nums[src];
            src++;
        }
    }
    return (dst + 1);
}

三、合并两个有序数组

  1、题目说明

题目链接:合并两个有序数组

给你两个按非递减顺序 排列的整数数组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] 。

提示:

nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-10^{9}<= nums1[i], nums2[j] <= 10^{9}

  2、题目解析

本题我使用了双指针并且两个都放在后面,然后进行比较,哪个比较大放在nums1的尾部,然后分别自减。这样就可以避免从前面作比较后造成的原nums1前面的元素丢失了。

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{
    int i1 = m - 1, i2 = n - 1;
    int j = m + n - 1;
    while (i1 >= 0 && i2 >= 0)
    {
        if (nums1[i1] > nums2[i2])
        {
            nums1[j--] = nums1[i1--];
        }
        else
        {
            nums1[j--] = nums2[i2--];
        }
    }
    while (i2 >= 0)
    {
        nums1[j--] = nums2[i2--];
    }
}


本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。 

  老铁们,记着点赞加关注哦!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php宝塔搭建部署实战彩纸屋在线少儿编程系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的彩纸屋在线少儿编程系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#x…

第一个完整的CMake工程

第一个完整的CMake工程一、概述二、准备工作2.1 创建工程2.2 创建源码目录三、换个地方保存目标二进制文件3.1 add_subdirectory 指令说明3.2 重设目标二进制生成目录四、如何安装4.1 目标文件的安装4.2 普通文件的安装4.3 非目标文件的可执行程序安装(比如脚本之类)&#xff1…

git 源码下载安装最新版本

问题 用yum install git 下载后查看版本 git --version 显示的版本太低&#xff0c;自己去github下载比较新的版本 解决 https://github.com/git/git/tags 查看最新的版本&#xff0c;并且复制tar.gz下载链接 wget 你复制的链接 我的例子&#xff1a;wget https://github.…

DevOps:开发运维全流程

目录 &#x1f9e1;什么是DevOps&#xff1f; &#x1f9e1;什么是CI/CD&#xff1f; &#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0c;每天对ta说不尽情话&#xff01; &…

第一章 计算机网络体系结构

目录(1) 概念与功能(2) 组成与分类(3) 标准化工作与组织(4) 性能指标(5) 分层结构、协议、接口、服务(6) 7 层 OSI 参考模型(7) TCP/IP 模型(8) 五层参考模型(1) 概念与功能 1、概念 计算机网络&#xff1a;是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备…

RHI_Shader Compare(HLSL、GLSL、MSL 、WGSL、OpenCL) Debug All

为了后续平台能够更好的封装跨平台Shader&#xff0c;本部分主要来看一下各平台Shader的语法特点、编译方式以及Debug方式等对比。 对于各类Shader语言还是先来看一下官方的文档&#xff0c;里边有具体的阐述&#xff0c;也是比较权威的文档&#xff1a; HLSL官方文档GLSL官…

sftp的基本使用

写在前面 在工作和学习中我们经常需要在linux和本地之间上传和下载文件&#xff0c;本文就一起来看下。 1&#xff1a;连接ftp 在window执行命令sftp 用户名IP,这里的用户名是linux服务器的用户名&#xff0c;IP是linux服务器的IP&#xff0c;如下&#xff1a; [c:\~]$ sft…

mysql统计查询和一行转多行(列转行)--- help_topic

mysql.help_topic help_topic本身是Mysql一个帮助解释注释表&#xff0c;用于解释Mysql各种专有名词&#xff0c;由于这张表数据ID是从0顺序增加的&#xff0c;方便我们用于计数&#xff0c;但是8.0.17版本的只有656条数据&#xff0c;超过这个数字&#xff0c;我们就需要己自定…

【王道操作系统】1.1.1 操作系统的概念、功能和目标(系统资源的管理者、提供接口、作为扩充机器、虚拟机)

操作系统的概念、功能、目标(系统资源的管理者、提供接口、作为扩充机器) 文章目录操作系统的概念、功能、目标(系统资源的管理者、提供接口、作为扩充机器)1.常见的操作系统举例2.操作系统的层次结构3.操作系统的概念4.操作系统的功能和目标4.1 作为计算机系统资源的管理者4.2…

LeetCode题解 二叉树(七):222 完全二叉树的节点个数;110 平衡二叉树;257 二叉树的所有路径

前言 阳过之后&#xff0c;已经有一周多没有接触过一道题目了 从今日开始恢复每日一小时的刷题日常 二叉树 222 完全二叉树的节点个数 medium 无论是深度遍历&#xff08;前中后都好&#xff09;还是层序遍历&#xff0c;都可以用于求解这道题&#xff0c;只需要使用一个额…

【电力系统综合能源】“双碳“背景下|综合能源系统中的经济-二氧化碳排放协调最优调度和敏感性分析研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2022年度回顾|在Jina AI社区连接、分享、共创

在 Jina AI 社区&#xff0c;每天都有来自世界各地的开发者加入&#xff0c;因技术产生连接&#xff0c;因连接带动分享&#xff0c;因分享促进共创。2022 的若干个闪亮的高光时刻&#xff0c;都有来自社区的支持和贡献&#xff1a;在春天&#xff0c;我们发布了 Jina 3.0&…

M1 ARM架构下, linux安装mysql的方式及潜在问题解决

下载: 1. 下载压缩包: 由于m1/m2芯片得使用aarch64架构, 所以普通的x86架构这里就完全无法使用了, 这里推荐在清华镜像网下载对应的aarch64版本: 安装包下载地址 2. Linux系统准备 默认的CentOS是自带mariadb, 和mysql的安装相冲突 , 所以需要提前删除 rpm -qa | grep mari…

Python 三种方法实现截图【详解+完整代码】

人生苦短 我用python 如何用python实现截屏&#xff1f; 一、方法一 PIL中的ImageGrab模块 使用PIL中的ImageGrab模块简单&#xff0c;但是效率有点低 PIL是Python Imaging Library&#xff0c; 它为python解释器提供图像编辑函数能力。 ImageGrab模块可用于将屏幕或剪贴板…

《Linux运维总结:Centos7.6部署redis6.2.8 cluster集群》

一、redis cluster集群规划 Centos7.6部署redis6.2.8 cluster集群资源包 环境信息如下&#xff1a; 主机IP操作系统Redis版本CPU架构端口角色192.168.1.191Centos7.66.2.8x86_647001master192.168.1.192Centos7.66.2.8x86_647002master192.168.1.193Centos7.66.2.8x86_647003m…

如何快速打造一个高权重的短视频账号?短视频运营推广日记(2)

之前做的短视频账号流量一直不好&#xff0c;终于狠下心来注销了&#xff0c;准备重新来过 趁现在账号注销期&#xff0c;好好了解一下短视频账号从0打造的内容&#xff0c;我赢的高权重账号打造内容反复阅读了9遍&#xff0c;终于总结出了属于自己的内容。 看过很多人说要养…

51. CPU和GPU

1. 你的GPU电脑 2. 提升CPU利用率的第一个方法 3. 样例分析 如果一个矩阵是按行存储&#xff0c;访问一行会比访问一列要快 CPU一次读取64字节&#xff08;缓存栈&#xff09;CPU会“聪明的”提前读取下一个&#xff08;缓存栈&#xff09; 4. 提升CPU利用率的第二个方法 高端…

字节一面:服务端挂了,客户端的 TCP 连接还在吗?

服务端进程崩溃&#xff0c;客户端会发生什么&#xff1f; TCP 的连接信息是由内核维护的&#xff0c;所以当服务端的进程崩溃后&#xff0c;内核需要回收该进程的所有 TCP 连接资源&#xff0c;于是内核会发送第一次挥手 FIN 报文&#xff0c;后续的挥手过程也都是在内核完成…

Linux 快照 (snapshot) 原理与实践(二) 快照功能实践

文章目录 0. 概要1. 准备演示数据2. 创建 snapshot-origin 目标3. 创建 snapshot 目标4. 验证 COW 操作4.1 第一次写数据4.2 第二次写数据5. 验证 ROW 操作5.1 第一次写数据5.2 第二次写数据6. 创建 snapshot-merge 目标7. 验证 merge 操作8. 后记0. 概要 上一篇《Linux 快照 …

【修改按钮的大小 Objective-C语言】

一、修改按钮的大小 1.还是上篇文章那个例子 点击加号的时候,使上面的图片按钮变大, 点击减号的时候,使上面的图片按钮变小 2.首先,需要给“加”按钮,注册单击事件 怎么办,拖线吧 右键点击这个列表中的“加”按钮,把这个按钮的Touch Up Inside右边的小圆圈,拖到Vi…