Leetcode—移除元素、删除有序数组中的重复项、合并两个有序数组

2023-05-16

移除元素

在这里插入图片描述
此题简单,用双指针方法即可,
如果右指针指向的元素不等于val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;
如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位。
在这里插入图片描述

且最后需要输出的数组长度就是left的值。不多说,上代码:

int removeElement(int* nums, int numsSize, int val)
{
    int left =0;
    int right =0;
    for(int i =0;i<numsSize;i++)
    {
        if(nums[right] != val)
        {
            nums[left]=nums[right];
            ++left;
            ++right;
        }
        else
        {
            ++right;
        }
    }
    return left;

}

时间复杂度:O(N)
空间复杂度:O(1)

删除有序数组中的重复项

在这里插入图片描述

暴力想法

(注意是暴力想法,不是暴力解法!)
作为直男直接就是想实现。
直接遍历,看题目是已经确定了是有序的,遇到与上一个不相等的直接给他拿到新的数组里面存起来。遍历完直接新数组就是答案。
看样子是很接近了哈!毕竟属于简单的题目。但是, O(1) 额外空间的条件下完成这个是我们跨不过去的坎。既然如此那就得考虑在原数组上操作。

双指针法

定义两个指针fast 和 slow 分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 1。
假设数组nums 的长度为 n。将快指针 fast 依次遍历从 1 到 n-1 的每个位置,对于每个位置,如果nums[fast] !=nums[fast-1],说明 nums[fast] 和之前的元素都不同,因此将 nums[fast] 的值复制到nums[slow],然后将 slow 的值加 1,即指向下一个位置。遍历结束之后,从 nums[0] 到 nums[slow−1] 的每个元素都不相同且包含原数组中的每个不同的元素,因此新的长度即为 slow,返回 slow 即可。
在这里插入图片描述

//C
int removeDuplicates(int* nums, int numsSize)
{
    int right =1;
    int left =1;
    for(int i=1;i<numsSize;i++)
    {
        if(nums[right-1]!=nums[right])
        {
            nums[left]=nums[right];
            ++left;
            ++right;
        }
        else
        {
            ++right;
        }
    }
    return left;
}

合并两个有序数组

在这里插入图片描述

方法一:直接合并后排序

最直观的方法是先将数组 nums 2放进数组nums 1的尾部,然后直接对整个数组进行排序。

int cmp(int* a, int* b) {
    return *a - *b;
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    for (int i = 0; i != n; ++i) {
        nums1[m + i] = nums2[i];
    }
    qsort(nums1, nums1Size, sizeof(int), cmp);
}

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

方法二:逆向双指针

观察可知,nums 1 的后半部分是空的,可以直接覆盖而不会影响结果。因此可以指针设置为从后向前遍历,每次取两者之中的较大者放进 nums 1的最后面。

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

}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode—移除元素、删除有序数组中的重复项、合并两个有序数组 的相关文章

  • vscode处理代码合并冲突

  • mysql---修改数据库root密码的方法

    为了数据库管理员root用户密码的安全 xff0c 可以定期修改密码 注意 xff1a 修改密码 必须要知道旧密码 才能设置新密码 并且要符合密码策略的要求 方法一 登录后修改 xff0c 数据库管理员连接服务后 修改自己的登陆密码 spa
  • 关于debian网卡驱动

    1 查看驱动信息的命令 xff1a 查看基本信息 xff1a lspci 22 00 0 有线网卡 25 00 0 无线网卡 26 00 0 Nvidia独立显卡 查看详细信息 xff1a lspci vvv 有线网卡使用的驱动为 xff1
  • Python实战,爬取金融期货数据

    大家好 xff0c 我是毕加锁 今天给大家带来的是 Python实战 xff0c 爬取金融期货数据 文末送书 xff01 文末送书 xff01 文末送书 xff01 任务简介 首先 xff0c 客户原需求是获取https hq smm cn
  • 在Ubuntu系统下利用Kazam软件录屏以及视频解码问题

    最近利用在本想在Ubuntu系统下录制一段仿真效果视频 xff0c 利用Ubuntu系统自带的录屏方式 xff0c 发现有些鸡肋 xff0c 因为只能录30秒 于是乎找了一款软件 xff0c 在此安利给大家 Kazam 1 Ubuntu系统
  • PMP1——3章经典题目

    第1题 以下哪个是项目的特点 xff1f A xff0e 必须为组织实现利润 B xff0e 通常会产出相同的产品 C xff0e 推动组织从当前状态转变到将来状态 D xff0e 项目是需要持续开展的重复性工作 第2题 旨在创造最终结果的
  • 认识世界和改造世界 [马原]

    认识世界与改造世界 认识世界 定义 认识世界 xff0c 就是主体能动地反映客体 xff0c 获得关于事物的本质和发展规律的科学知识 xff0c 探索和掌握真理 认识世界的活动是客观见之于主观 xff0c 是要认识事物发展的规律性 如何认识
  • C#工控上位机开发-->1、C#快速编程入门

    学习目标 xff1a 一 控制台的输入输出二 C 中的变量使用三 字符串的拼接与格式化的三种方式四 数据类型转换的三种方式 学习内容 xff1a 1 控制台的输入输出 xff08 1 xff09 输入方法 xff1a Console Rea
  • C#工控上位机开发---2.面向对象编程

    学习目标 xff1a 1 对象与类的概念 2 类的组成 3 字段 属性 方法 4 属性扩展 学习内容 xff1a 1 1 对象与类的概念 xff1a 类就是以对象共有的属性 xff0c 方法来定义的一个整体 xff0c 也就是一类 xff0
  • ubuntu16.04配置JDK环境变量(JDK8u2)

    一 流程 1 官网下载JDK 2 解压缩 放到指定目录 3 配置环境变量 4 设置系统默认JDK 5 测试jdk 二 步骤 1 官网下载JDK xff08 下载jdk8为例 xff09 https www oracle com techne
  • STM32的一键下载CH340 DTR RTS与复位电路NRST的学习笔记

    这两天在学习stm32最小系统板的时候 对这一部分特别的不理解 于是就去找了很多东西去看 先说一键下载电路吧 先引用一张正点原子的原理图 xff1a 在芯片手册上查找ch340的手册 xff0c 上面对于 RTS与DTR的定义是这样的 xf
  • Linux学习笔记——逻辑卷及vdo的建立

    目录 前言 一 逻辑卷 1 如何建立lvm设备 xff1a xff08 1 xff09 lvm的拉伸 xff08 2 xff09 lvm缩减 xff08 3 xff09 lvm快照 xff08 4 xff09 lvm删除 二 vdo Vir
  • BGP路由器协议排错教程:BGP 对等体翻动问题

    完整版下载 2022年最新BGP路由协议排错教程指南 网络安全文档类资源 CSDN下载 BGP 对等体失效问题讨论的是当 BGP 邻居关系总是在 Idle xff08 空闲 xff09 状态和 Active xff08 活跃 xff09 状
  • VUE 事件总线

    VUE 事件总线 事件总线通俗理解为在平级的兄弟组件上的传参 1 将事件总线挂载到原型上 span class token keyword new span span class token class name Vue span span
  • 一看就懂的java虚拟机内存区域划分

    一 虚拟机 同样的java代码在不同平台生成的机器码肯定是不一样的 xff0c 因为不同的操作系统底层的硬件指令集是不同的 同一个java代码在windows上生成的机器码可能是0101 xff0c 在linux上生成的可能是1100 xf
  • 硬核,20道经典Java基础面试题

    最近整理了20道Java基础面试题 xff0c 大家一起加油哈 1 ArrayList和LinkedList有什么区别 xff1f 可以从它们的底层数据结构 效率 开销进行阐述哈 ArrayList是数组的数据结构 xff0c Linked
  • 面向无人机的视觉目标跟踪算法:综述与展望

    摘要 近年来 无人机因其小巧灵活 智能自主等特点被广泛应用于民用和军事等领域中 特别是搜索侦察过程中首要的目标跟踪任务 无人机视觉目标跟踪场景的复杂性和运动目标的多变性 使得目标特征提取及模型建立困难 对目标跟踪性能带来巨大的挑战 本文首先
  • 网络空间对抗防御中的智能监测技术研究

    摘 nbsp nbsp 要 nbsp 网络空间数据流观测与威胁行为分析是国家网络空间安全防御中的重要方向 为 nbsp nbsp nbsp 应对国家网络空间大规模数据流观测和不断涌现的网络威胁对抗防御重大需求 针对传统 nbsp nbsp
  • Promethues (普罗米修斯)详细介绍

    目录 引言 一 Prometheus 概述 1 什么是Prometheus 2 Zabbix和Prometheus区别 3 Prometheus的特点 二 运维监控平台设计思路 三 Prometheus监控体系 1 系统层监控 xff08
  • 使用vue对表格数据进行查询

    大家好 xff0c 今天小明给大家带来一个带有查询框 的表格 xff0c 下面给大家瞅瞅效果图片 xff1a 带查询框的表格 xff0c 查询前的效果图 带查询框的表格 xff0c 查询后的效果图 从效果图上可以看出 xff0c 在查询框内

随机推荐

  • Linux操作系统面试总结

    1 系统启动流程 uboot gt kernel gt 根文件系统 uboot第一阶段属于汇编阶段 xff1a 定义入口 xff08 start S xff09 xff1a uboot中因为有汇编阶段参与 xff0c 因此不能直接找main
  • 详谈静态库和动态库的区别

    一 什么是库 xff1a 库是写好的 xff0c 现有的 xff0c 成熟的 xff0c 可以复用的代码 现实中每个程序都要依赖很多基础的底层库 xff0c 不可能每个人的代码都从零开始 xff0c 因此库的存在意义非同寻常 本质上来说 x
  • HDFS读取流程

    在HDFS的读写流程中 xff0c 主要是分为HDFS的读流程和写流程 其中先由HDFS写数据 xff0c 之后HDFS才可以读流程 HDFS写流程 Client向NameNode发送消息 xff0c 通过RPC与NameNode建立通信
  • 删除图片名与xml(json)文件名称不对应的

    1 文件夹下无目录文件夹 xff08 纯文件 xff09 import os def scanfile path 获取图片路径 xff08 列表格式 xff09 filelist 61 os listdir path for filepat
  • FreeRTOS内存不够

    STM32F103 xff0c RAM大小为20K xff0c 看起来还是很多的 xff0c 但一运行FreeRTOSG有点功能的程序马上就内存不够了 xff1b unable to allocate space for sections
  • FreeRTOS 任务之间运行时序

    操作系统 xff0c 我们肯定会创建许多任务 xff0c 而且任务的优先级不一样 xff0c 但我们一般情况是采用抢占模式 xff0c 也就是一直运行当前最高优先级任务 xff0c 那么其他低优先级任务就无法运行 xff0c 这时候需要通过
  • c语言-查找指定字符

    题目源自pta xff0c 侵删 本题要求编写程序 xff0c 从给定字符串中查找某指定的字符 输入格式 xff1a 输入的第一行是一个待查找的字符 第二行是一个以回车结束的非空字符串 xff08 不超过80个字符 xff09 输出格式 x
  • linux查看日志文件内容命令sed、cat、tac、more、less、head、tail、echo 1、按时间查询

    查询日志 xff1a linux查看日志文件内容命令sed cat tac more less head tail echo 1 按时间查询 sed n 39 2017 09 20 14 00 2017 09 20 15 00 p 39 c
  • 计算机保研面试经验分享—重庆大学

  • uCOS学习笔记——实时操作系统概述

    一 概述 RTOS real time operation system 既实时操作系统 通俗来说 xff0c 实时操作系统正如一个大管家一般 xff0c 可以根据任务的要求 xff0c 进行资源管理 xff0c 消息管理 xff0c 任务
  • windows HLK server部署操作步骤

    Windows Hardware Lab Kit HLK 微软官方提供的测试工具组 xff0c 也是微软的一种认证工具 xff0c 只有经过HLK测试过的windows系统 xff0c 官方才认可 The Windows Hardware
  • uCOS学习笔记----任务管理

    一 任务管理 一 任务的概念 从前文得知 xff0c uCOS可以将裸机中庞大的while 1 循环拆解为执行不同功能的小程序 xff0c 并依据一定的规则调度任务的运行 这些小程序就被称为任务 一般而言 xff0c 任务由三个部分构成 x
  • 想说说关于在刷题网站(牛客 、C语言网、力扣)上测试样例过了但是OJ判错这档子事

    目录 1 话题引入 2 在刷题过程中一些自己想说的 3 刷题时的一些小建议 4 个人感悟 1 话题引入 首先介绍一下我自己 xff0c 本人是一名专科大一的学生 xff1b 非计算机本专业 xff1b 因为想拓宽自己的知识面和技术 xff1
  • Java实现爬虫

    目录 xff1a 1 爬虫原理 2 本地文件数据提取及分析 3 单网页数据的读取 4 运用正则表达式完成超连接的连接匹配和提取 5 广度优先遍历 xff0c 多网页的数据爬取 6 多线程的网页爬取 7 总结 爬虫实现原理 网络爬虫基本技术处
  • Python+ADB脚本

    目录 准备工具 问题解决 xff1a 如何安装adb和python xff1f 编写程序 实现 注意 xff1a 准备工具 进入正题 xff0c 首先要准备的工具如下 1 一台正常的电脑且安装adb和python环境 2 一部安卓手机 4
  • (++i)+(++i)+(++i)计算的探讨

    今天在进行着代码选择题练习的时候 xff0c 我忽然看到了这一题 我左思右想 xff0c 发现答案应当是 xff08 2 xff09 43 xff08 3 xff09 43 xff08 4 xff09 61 9 xff0c 可我仍然保有着疑
  • 超详细讲解长度受限制的字符串函数(保姆级教程!!!)

    超详细讲解长度受限制的字符串函数 xff08 保姆级教程 xff01 xff01 xff01 xff09 长度受限制的字符串函数strncpy函数strncpy函数的使用strncpy函数的模拟实现 strncat函数strncat函数的使
  • 超详细讲解字符串查找函数(保姆级教程!!!)

    超详细讲解字符串查找函数 xff08 保姆级教程 xff01 xff01 xff01 xff09 字符串查找函数strstr函数strstr函数的使用strstr函数的模拟实现 strtok函数strtok函数的使用strtok函数的模拟实
  • 超详细讲解线性表和顺序表!!

    超详细讲解线性表和顺序表 xff01 xff01 线性表顺序表顺序表的概念及结构静态顺序表动态顺序表 顺序表接口实现1 创建2 初始化3 扩容4 尾插5 打印6 销毁7 尾删8 头插9 头删10 插入任意位置11 删除任意位置12 查找13
  • Leetcode—移除元素、删除有序数组中的重复项、合并两个有序数组

    移除元素 此题简单 xff0c 用双指针方法即可 xff0c 如果右指针指向的元素不等于val xff0c 它一定是输出数组的一个元素 xff0c 我们就将右指针指向的元素复制到左指针位置 xff0c 然后将左右指针同时右移 xff1b 如