【面试经典150 | 数组】删除有序数组中的重复项 II

news2024/11/15 8:27:57

文章目录

  • 写在前面
  • Tag
  • 题目解读
  • 题目来源
  • 解题思路
    • 方法一:原地操作
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【原地操作】【双指针】【数组】


题目解读

给你一个有序数组 nums,请你进行【原地操作】移除数组中的元素,使得每个元素出现的次数不得超过 2。返回移除后新数组的长度。


题目来源

面试经典 150 题 —— 80. 删除有序数组中的重复项 II


解题思路

方法一:原地操作

【原地操作】移除多余的元素,首先应该想到 “覆盖” 操作,即利用一些数来覆盖掉多余的元素。

由于只允许每个元素最多出现两次,因此数组的前两个元素不用考虑,如果数组的长度 <= 2,直接返回原数组的长度即可。

现在开始讨论更一般的即数组长度大于 2 的情况。因为数组是排好序的,所以重复的数字一定在相邻的位置。我们使用双指针来解决这个问题,slow 指针指向无重复数字放置的位置,也表示已经处理好的数组长度,fast 指针指向每一个将要处理的数字。我们利用指针 fast 遍历数组检查每一个元素是否应该被保留,如果应该被保留,将其移动到 slow 处:

  • 如果 nums[fast] = nums[slow-2],此时必然有 nums[fast] = nums[slow-1] = nums[slow - 2],说明当前检查的元素有 3 重复的值,那么当前检查元素 nums[fast] 不应该被保留;
  • 否则,nums[fast] 应该被保留;
  • 最后,slow 即为处理好的数组的长度。

实现代码

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n <= 2) {
            return n;
        }

        int slow = 2, fast = 2;
        while (fast < n) {
            if (nums[fast] != nums[slow - 2]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 nums 的长度。

空间复杂度: O ( 1 ) O(1) O(1),因为只使用了两个指针变量,属于【原地操作】。


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

Hadoop生态圈中的数据同步工具SQOOP

Hadoop生态圈中的数据同步工具SQOOP 一、sqoop的概念二、sqoop的核心功能1、数据导入import2、数据导出export 三、sqoop的底层实现四、sqoop的安装和部署五、sqoop的基本操作1、sqoop查看RDBMS中有哪些数据库2、sqoop查看某一个数据库下有哪些数据表3、通过sqoop执行sql语句 …

SOLIDWORKS有限元分析怎么做?

在许多专业领域中&#xff0c;尤其是在机械行业&#xff0c;为了缩短开发周期&#xff0c;设计完成后通常需要进行仿真分析。通常情况下&#xff0c;大家会使用专业的有限元仿真软件如ANSYS进行仿真分析。但其实&#xff0c;SOLIDWORKS软件因其简单易用的制图功能以及内置的专用…

bigcache

bigcache 介绍 借用下图片&#xff0c;实际上&#xff0c;这张图还不太全&#xff0c;queueItem 中&#xff0c;entrydata的最前端 8 字节是时间戳&#xff0c;用来计算过期时间的。 bigcache 的思想主要有以下几点&#xff1a; 大并发下&#xff0c;尽量减少同步带来的时…

3 分钟,带你了解低代码开发

一、低代码平台存在的意义 传统软件开发交付链中&#xff0c;需求经过3次传递&#xff0c;用户→业务→架构师→开发&#xff0c;每一层传递都可能使需求失真&#xff0c;导致最终交付的功能返工。 业务的变化促使软件开发过程不断更新、迭代和演进&#xff0c;而低代码开发即是…

2023!6招玩转 Appium 自动化测试

Appium是个什么鬼 Appium是一个移动端的自动化框架&#xff0c;可用于测试原生应用&#xff0c;移动网页应用和混合型应用&#xff0c;且是跨平台的。可用于IOS和Android以及firefox的操作系统。原生的应用是指用android或ios的sdk编写的应用&#xff0c;移动网页应用是指网页…

合约谈崩,3大汽车厂工人集体罢工 | 百能云芯

周五&#xff0c;美国联合汽车工会&#xff08;UAW&#xff09;在底特律三大汽车制造商通用汽车、福特汽车和克莱斯勒母公司Stellantis旗下的各一家工厂同步举行了罢工&#xff0c;可能因工资和就业保障问题引发一场代价高昂且长时间的对峙。 协商签订新劳资协议的最后期限已过…

【多线程】死锁 详解

死锁 一. 死锁是什么二. 死锁的场景1. 一个线程一把锁2. 两个线程两把锁3. N 个线程 M 把锁 三. 死锁产生的四个必要条件四. 如何避免死锁 一. 死锁是什么 死锁是这样一种情形&#xff1a; 多个线程同时被阻塞&#xff0c;因为每个进程都在等其他线程释放某些资源&#xff0c;…

在波卡区块链学院学习 Web3 是种什么体验?

成立于 2022 年的 Polkadot Blockchain Academy&#xff08;波卡区块链学院&#xff0c;以下简称 PBA&#xff09;是由波卡生态成立的一个深入的、开创性的区块链课程&#xff0c;致力于帮助 Web3 创新者和未来的顶级编程人员实现他们的想法和抱负。 波卡区块链学院由波卡创始…

LeetCode 1222. 可以攻击国王的皇后【数组,模拟】1391

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Yakit学习

Yakit下载 下载地址&#xff1a; yaklang/yakit: Cyber Security ALL-IN-ONE Platform (github.com) MITM交互式劫持 这个模块相当于burpsuite的proxy模块&#xff0c;MITM 操作台可百分百替代 BurpSuite执行所有操作(下载并安装证书、劫持请求、响应、编辑劫持到的数据包等)。…

Datax 数据同步-使用总结(二)

一、前言 这部分主要记录 datax 实现增量同步的方案。 二、核心思路 结合datax 提供的preSql、 postSql以及占位符&#xff0c;外加另外一张表同步日志表来记录相关同步信息。 三、版本迭代 3.1 初版本 where tbq.opera_date > cast(date_format(DATE_SUB(NOW(), inte…

图论第四天|127. 单词接龙、841. 钥匙和房间、463. 岛屿的周长

127. 单词接龙 ★ 文档讲解 &#xff1a;代码随想录 - 127. 单词接龙 状态&#xff1a;开始学习。&#xff08;★&#xff1a;需要多次回顾并重点回顾&#xff09; 思路&#xff1a; 本题需要解决两个问题&#xff1a; 图中的线是如何连在一起的 题目中并没有给出点与点之间的…

【Robotframework+python】实现http接口自动化测试

前言 下周即将展开一个http接口测试的需求&#xff0c;刚刚完成的java类接口测试工作中&#xff0c;由于之前犯懒&#xff0c;没有提前搭建好自动化回归测试框架&#xff0c;以至于后期rd每修改一个bug&#xff0c;经常导致之前没有问题的case又产生了bug&#xff0c;所以需要…

长城汽车,能打“持久战”吗?

文丨智能相对论 作者丨沈浪 百年汽车工业史正在进入一个全新的发展阶段&#xff1a;油改电的变革仍在激化&#xff0c;智能化的探索才刚刚起步&#xff0c;汽车产品将以什么样的面貌展现在世人面前&#xff0c;市场格局又将迎来怎样的变化&#xff1f;无人可知。 然而&#…

【Linix-Day12-线程同步和线程安全】

线程同步 和 线程安全 线程同步 除了信号量和互斥锁&#xff08;互斥锁和条件变量上次介绍过&#xff09;&#xff0c;还有两种方式同步 1.读写锁 当同时对一块内存读写时&#xff0c;会出现下列问题&#xff0c;故而引入读写锁 接口介绍&#xff1a; 1.int pthread_rwloc…

PostgreSQL 事务并发锁

文章目录 PostgreSQL 事务大家都知道的 ACID事务的基本使用保存点 PostgreSQL 并发并发问题MVCC PostgreSQL 锁机制表锁行锁 总结 PostgreSQL 事务 大家都知道的 ACID 在日常操作中&#xff0c;对于一组相关操作&#xff0c;通常要求要么都成功&#xff0c;要么都失败。在关系…

Windows PHP 将 WORD转PDF,执行完成后 释放进程

Windows PHP 将 WORD转PDF,执行完成后 释放进程 word转PDF清理任务进程 【附赠彩蛋】每次PHP执行完word转pdf之后,在任务进程中都会生成并残留WINWORD.EXE进程,时间久了,服务器就会越来原卡,本文完整的讲述怎么转PDF和转换之后的操作。 word转PDF /**$doc 传入完整的doc路…

flutter run长时间卡在Running Gradle task “assembleDebug“问题解决

1.下载离线gradle, 在android>>gradle>>wrapper 中找到gradle-wrappper.properties 可以看到要下载的gradle的版本 下载官方链接,更改url的版本号就好 Gradle | Thank you for downloading Gradle! 在android>>gradle>>wrapper 中找到gradle-wra…

【C++从0到王者】第三十二站:异常

文章目录 一、C语言传统的处理错误的方式二、C异常概念三、异常的使用四、异常的抛出与捕获1.异常的抛出原则2.在函数调用链中异常栈展开匹配原则 五、实际应用中的异常使用六、C标准库的异常体系七、异常规范八、异常安全九、异常的优缺点总结 一、C语言传统的处理错误的方式 …