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

news2024/11/25 14:25:04

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:双指针
  • 写在最后

写在前面

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

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

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

Tag

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


题目来源

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


题目解读

题目意思明确,删除升序排序数组中重复的数字,使每个元素只出现一次,最后返回删除后的数组新长度。元素的相当顺序不能改变,并且要求进行原地操作。

原地操作的意思是不借助其他的数据结构(比如说数组)完成题目要求的删除操作,空间复杂度为 O ( 1 ) O(1) O(1)。如果没有这个条件限制的话,利用一个数组和集合就可以快速实现删除操作了,空间复杂度为 O ( n ) O(n) O(n)


解题思路

方法一:双指针

现在要求原地操作,仅使用有限个变量实现相应的功能。

因为现在的数组是排好序的,所以重复的数字一定在相邻的位置。我们使用双指针来解决这个问题,slow 指针指向无重复数字放置的位置,也表示处理好的数组的长度,fast 指针指向每一个将要处理的数字。

特殊的,如果数组的长度小于等于 1,说明数组为空或者仅有 1 个元素,直接返回数组的长度。

现在开始讨论一般的即数组长度大于 2 的情况。两个指针都从 1 位置开始遍历,0 位置的元素不用管,对于每个位置:

  • 如果 nums[fast] = nums[fast-1],说明该元素重复了,不保留;
  • 否则,说明 nums[fast] 是一个新出现元素,保留即可;
  • 最后,返回 slow 即为处理好的数组的长度。

现在以数组 nums = [0, 0, 1, 2, 2, 2, 3, 3] 为例,以图示的方式进行说明以上算法流程。

(1)数组长度大于 1,双指针从 1 位置开始;

(2)nums[1] = nums[0],说明 nums[1] 元素重复了,不保留,fast 指针右移一位,处理下一个元素;

(3)nums[2] != nums[1],说明 nums[2] 是新出现的元素,保留;

(4)slow 指针右移一位,fast 指针每次都右移一位,处理下一个元素;

(5)nums[3] != nums[2],说明 nums[3] 是新出现的元素,保留;

(6)slow 指针右移一位,fast 指针每次都右移一位,处理下一个元素;

(7)nums[4] = nums[3],说明 nums[4] 元素重复了,不保留,fast 指针右移一位,处理下一个元素;

(8)nums[5] = nums[4],说明 nums[5] 元素重复了,不保留,fast 指针右移一位,处理下一个元素;

(9)nums[6] != nums[5],说明 nums[6] 是新出现的元素,保留;

(10)slow 指针右移一位,fast 指针每次都右移一位,处理下一个元素;

(11)nums[7] = nums[6],说明 nums[7] 元素重复了,不保留,fast 指针右移一位,处理下一个元素;

(12)fast 指针越界,表明没有元素需要处理了,返回 slow,表示的就是无重复元素的数量。

实现代码

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

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

复杂度分析

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

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


写在最后

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

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

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

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

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

相关文章

一个Qt鼠标透传场景与事件过滤器的用法

一个Qt鼠标透传场景与事件过滤器的用法 最近工作中遇到一个开发场景&#xff0c;将一个QWidget控件&#xff08;称为控件A&#xff09;放入QScrollArea&#xff0c;该控件A重写了QWidget::wheelEvent&#xff0c;根据鼠标滚轮事件缩放内部的绘制视图。当控件过大时&#xff0c…

软件工程评级B-,有大量调剂名额。北京联合大学考情分析

北京联合大学(B-) 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1239字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 北京…

FreeMarker详细介绍

FreeMarker详细介绍 FreeMarker FreeMarker概述 FreeMarker概念 FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 是一个Java类库…

nodejs实现websocket服务端和客户端

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

MySQL长文本字段的选取

某个字段需要存储 长文本类型的数据,长度可变,范围不清. varchar最多能存储多大长度呢? 何种情况下用text更好? 以下内容就为探究这个问题: <1>.先将content字段设为varchar(255),则此字段只能最多存储255个字符数 package mainimport "fmt"func main() { va…

2023年会展行业研究报告

第一章 行业概况 1.1 定义 会展行业是一个多元化和复杂的领域&#xff0c;涵盖了许多不同的活动和功能。一般来说&#xff0c;会展业是指在一定的区域空间内&#xff0c;许多人聚集在一起形成的定期或者不定期&#xff0c;制度或者非制度&#xff0c;传递和交流信息的群众性的…

Visual Studio运行Python程序(超级详细)

Visual Studio Code&#xff0c;简称 VS Code&#xff0c;是由微软公司开发的 IDE 工具。与微软其他 IDE&#xff08;如 Visual Studio&#xff09;不同的是&#xff0c;Visual Studio Code 是跨平台的&#xff0c;可以安装在 Windows、Linux 和 macOS平台上运行。 不仅如此&am…

UMA 2 - 创建自己的UMA模型⭐一.配置Blender环境

文章目录 🟥 下载 simple_renaming_panel🟧 Blender安装插件🟨 启用插件并保持自动更新🟩 打开插件视图🟥 下载 simple_renaming_panel UMA需要指定的人物骨骼名称,因此我们用该Blender插件快捷重命名. 下载链接: https://github.com/Weisl/simple_renaming_panel �…

阅读类APP广告变现的商业化发展方向

免费阅读类 APP 对广告的依赖程度较高。因此&#xff0c;如何实现流量精细化运营以最大化流量价值&#xff0c;是流量主面临的关键课题和难点&#xff1b;与此同时&#xff0c;免费阅读 APP 的 PV 量极大&#xff0c;但 UV、DAU 量级相对较小&#xff0c;因此&#xff0c;如何开…

python 学习笔记(6)—— Flask 、MySql

目录 Flask 1、起步 2、渲染项目的首页 3、处理无参数的 GET 请求 4、处理有 query 参数的 GET 请求 6、处理 params 参数的 get 请求 6、处理 application/json 类型请求体的 POST 请求 7、根据参数渲染模板页面 8、上传文件 数据库操作&#xff08;mysql&#xff0…

Jenkins结合gitlab自动化持续集成

最近在公司有负责搭建自动化测试环境&#xff0c;自动化脚本写好后&#xff0c;毋庸置疑是需要将自动化脚本进行持续集成测试&#xff0c;能够根据企业的定制化需求&#xff0c;通过Jenkins触发执行构建任务&#xff0c;定时执行自动化脚本等&#xff0c;今天就给大家介绍一下J…

可视化大屏设计模板 | 主题皮肤(报表UI设计)

下载使用可视化大屏设计模板&#xff0c;减少重复性操作&#xff0c;提高报表制作效率的同时也确保了报表风格一致&#xff0c;凸显关键数据信息。 软件&#xff1a;奥威BI系统&#xff0c;又称奥威BI数据可视化工具 所属功能板块&#xff1a;主题皮肤上传下载&#xff08;数…

【实践篇】redis管道pipeline使用详解

文章目录 0. 前言什么场景下使用redis管道特性 1.原理1.1 redis管道特性的处理机制 使用redis管道优化示例3. springboot使用redis管道示例4. 参考资料5. 源码地址6. Redis从入门到精通系列文章 0. 前言 Redis管道&#xff08;Pipeline&#xff09;是一种批量执行Redis命令的机…

Revit SDK 介绍:TypeRegeneration 修改类型,更新文档 ValidateParameters 参数合法性验证

前言 这篇文章介绍两个例子&#xff0c;逻辑比较简单&#xff1a; TypeRegeneration 修改类型&#xff0c;更新文档ValidateParameters 参数合法性验证 内容 TypeRegeneration FamilyType 不是继承自 Element 的&#xff0c;而是独立于 Element 体系之外&#xff0c;直接从…

window.structuredClone()

先看下兼容性 1. 创建一个要克隆的对象。例如&#xff1a; const originalObj {name: John,age: 25,address: {city: New York,country: USA} };2. 调用structuredClone()方法克隆对象。例如&#xff1a; const clonedObj window.structuredClone(originalObj);3. clonedObj将…

软件安全研究(四)

文章目录 Fine-Grained Code Clone Detection with Block-Based Splitting of Abstract Syntax Tree文章结构IntroMotivationDefinitionSystemOverviewProcessingVerify Experimentexperimental settingsRQ1RQ2RQ3RQ4RQ5 Fine-Grained Code Clone Detection with Block-Based S…

MeterSphere压测,出现HttpHostConnectException

现象&#xff1a;MeterSphere更换压力机后&#xff0c;压测出现出现HttpHostConnectException 解决方案&#xff1a; net.ipv4.tcp_tw_reuse默认是0或者2&#xff0c;更改为1 net.ipv4.tcp_tw_reuse&#xff0c;表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连…

轻量级软件FastGithub实现稳定访问github

当我们想访问全球最大的“同性交友网站”https://github.com/ 时&#xff0c;总会出现无法访问的界面&#xff0c;令人非常苦恼&#xff1a;幸运的是&#xff0c;有一种轻量级的软件可以帮助我们稳定地访问GitHub&#xff0c;那就是FastGithub。 什么是FastGithub&#xff1f…

数据结构和算法(5):二叉树

树 向量允许通过下标或秩&#xff0c;在常数的时间内找到目标对象&#xff1b;然而&#xff0c;一旦需要对这类结构进行修改&#xff0c;那么无论是插入还是删除&#xff0c;都需要耗费线性的时间。 列表允许借助引用或位置对象&#xff0c;在常数的时间内插入或删除元素&…

去除pdf/word的水印艺术字

对于pdf中的水印如果无法去除水印&#xff0c;则先另存为word&#xff0c;然后再按下面办法处理即可&#xff1a; 查看宏&#xff0c;创建&#xff1a;删除艺术字 添加内容&#xff1a; Sub 删除艺术字()Dim sh As ShapeFor Each sh In ActiveDocument.ShapesIf sh.Type msoT…