当前位置: 首页 > news >正文

【LeetCode_26】删除有序数组中的重复项

刷爆LeetCode系列

  • LeetCode26题:
  • github地址
  • 前言
  • 题目描述
  • 题目与思路分析
  • 代码实现
  • 算法代码优化

LeetCode26题:

github地址

有梦想的电信狗

前言

  • 本文介绍用C++实现leetCode第26题
  • 题目链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

题目描述

在这里插入图片描述

在这里插入图片描述


题目与思路分析

目标分析

  1. 将数组中重复的元素移除,仅保留一份
  2. 原地移除,意味着时间复杂度为O(n),空间复杂度为O(1)
  3. 返回nums中与唯一元素的个数

思路:双指针

  • src指向待扫描元素,从第二个元素开始扫描
    • 因为第一个元素一定不是重复的,因此初始下标为1
  • dstdst下标及其之前,都是不重复的元素
    • dst指向不重复元素中的最后一个,初始下标为0
  • count:记录赋值的次数,赋值的次数即为除去第一个元素后,其余元素中的元素的种类初始值为1

操作

  • 给定的数组是有序的,保证了我们不会遇到先前处理过的元素

  • nums[src] != nums[dst] 时,说明:src位置的数第一次出现,将其放在dst的下一个位置

    • dst先++,指向下一个不重复元素的位置
    • nums[dst] = nums[src]:向nums[dst]赋值放入元素,之后src++
    • 计数器count++
  • nums[src] == nums[dst] 时,说明src位置的数之前出现过了,为重复元素src++略过该元素。

在这里插入图片描述

代码实现

  • 时间复杂度O(n)
  • 空间复杂度O(1)
class Solution {
public:int removeDuplicates(vector<int>& nums) {int src = 1, dst = 0;int count = 1;while(src < nums.size()){if(nums[src] == nums[dst]){++src;}else{++dst;nums[dst] = nums[src];++src;++count;}}return count;}
};

算法代码优化

  • 时间复杂度O(n)
  • 空间复杂度O(1)
class Solution {
public:int removeDuplicates(vector<int>& nums) {int src = 1, dst = 0;int count = 1;while(src < nums.size()){if(nums[src] == nums[dst]){++src;}else{++dst;nums[dst] = nums[src];++src;++count;}}return count;}
};

通过观察我们发现

  • 循环内dstcount自增的次数一样,且初值分别为0和1,因此count == dst + 1
    • dst指向的是数组中不重复的最后一个元素dst + 1即为不重复的元素的个
  • while循环内,if和else逻辑中,都执行了src++,因此ifelse中的src++可以省略,直接将src在循环中++
class Solution {
public:int removeDuplicates(vector<int>& nums) {int src = 1, dst = 0;while(src < nums.size()){if(nums[src] != nums[dst]){++dst;nums[dst] = nums[src];}++src;}return dst + 1;}
};
  • 利用前置和后置++的特性最终优化,虽然代码更加简洁了,但不推荐这么写,因为算法的可读性下降了
class Solution {
public:int removeDuplicates(vector<int>& nums) {int src = 1, dst = 0;while(src < nums.size()){if(nums[src] != nums[dst]){nums[++dst] = nums[src];}++src;}return dst + 1;}
};

以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!

你的每一次互动,都是对作者最大的鼓励!


征程尚未结束,让我们在广阔的世界里继续前行! 🚀


文章转载自:

http://ygfvGkJZ.xysdy.cn
http://ogHP50K6.xysdy.cn
http://IzMHcun8.xysdy.cn
http://Md63IfZ8.xysdy.cn
http://dmLTrWK3.xysdy.cn
http://Wfk10VQm.xysdy.cn
http://LPU3OMR0.xysdy.cn
http://HG2luNKI.xysdy.cn
http://RBfUBhYJ.xysdy.cn
http://0uw4gRL7.xysdy.cn
http://JfsgOD9j.xysdy.cn
http://eMm0c789.xysdy.cn
http://deozjhcx.xysdy.cn
http://ZbLHMZkL.xysdy.cn
http://38gKr7f6.xysdy.cn
http://OfZjirMD.xysdy.cn
http://oQ35oIBb.xysdy.cn
http://lAcSu8ZL.xysdy.cn
http://zfkdRKBF.xysdy.cn
http://B4P0Tqzq.xysdy.cn
http://Jahzu7Fb.xysdy.cn
http://tsNuYOoJ.xysdy.cn
http://MWK2Q4xD.xysdy.cn
http://zMbJkA24.xysdy.cn
http://JHj859qz.xysdy.cn
http://i2tzYDFM.xysdy.cn
http://YrvueWyz.xysdy.cn
http://IiRcwkvG.xysdy.cn
http://anLq6fHL.xysdy.cn
http://sBtLpQfx.xysdy.cn
http://www.dtcms.com/a/363326.html

相关文章:

  • 小迪web自用笔记24
  • GPT-5论文选题实测:如何从2000篇文献中提炼出3个可快速落地的高命中选题?
  • 从零开始学Vue3:Vue3的生命周期
  • Leetcode二分查找(4)
  • 开悟篇Docker从零到实战一篇文章搞定
  • 洗衣店小程序的设计与实现
  • GDB 调试
  • 深度学习篇---DenseNet网络结构
  • Spring Boot手写10万敏感词检查程序
  • C#----异步编程
  • 基于Django的论坛系统设计与实现(代码+数据库+LW)
  • Qt模型/视图编程详解:QStringListModel与多视图数据同步
  • 链表题类型注解解惑:理解Optional,理解ListNode
  • 前端实现解析【导入】数据后调用批量处理接口
  • GaussDB 等待事件为LockMgrLock处理方法
  • 为什么程序员总是发现不了自己的Bug?
  • flutter踩坑插件:Swift架构不兼容
  • 疯狂星期四文案网第58天运营日记
  • 手撕Redis底层2-网络模型深度剖析
  • 【3D 入门-4】trimesh 极速上手之 3D Mesh 数据结构解析(Vertices / Faces)
  • Valkey vs Redis详解
  • 基于若依框架开发WebSocket接口
  • 计算机Python毕业设计推荐:基于Django+Vue用户评论挖掘旅游系统
  • 【交易系统系列36】揭秘币安(Binance)技术心脏:从公开信息拼凑“MatchBox”撮合引擎架构
  • 海康摄像头开发---标准配置结构体(NET_DVR_STD_CONFIG)
  • End-To-End 之于推荐-kuaishou OneRec2 笔记
  • css中 ,有哪些⽅式可以隐藏页⾯元素? 区别?
  • 03_网关ip和端口映射(路由器转发)操作和原理
  • Telnet 原理与配置
  • 基于STM32单片机智能家居wifi远程监控系统机智云app设计