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

【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://www.xdnf.cn/news/19627.html

相关文章:

  • 手撕Redis底层2-网络模型深度剖析
  • 云电脑是什么?与普通电脑的区别在哪里?——天翼云电脑体验推荐
  • 全国产FT-M6678核心板
  • SQL JOIN 操作全面解析
  • 哈希表-面试题01.02.判定是否互为字符重排-力扣(LeetCode)
  • 【LeetCode数据结构】栈和队列的应用
  • 在windows平台oracle 23ai 数据库上使用bbed
  • 面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用
  • SQLShift 实现Oracle 到 OceanBase 的存储过程转换初体验
  • 【Vue2 ✨】 Vue2 入门之旅(六):指令与过滤器
  • 阿里云和华为云Rocky LINUX 9.X镜像就绪及低端可用英伟达GPU
  • Google NotebookLM最强替代品评测:AI笔记、语音生成与高效知识管理工具盘点
  • 【Linux基础知识系列:第一百一十八篇】使用perf进行性能分析
  • Day33 网络编程:OSI/TCP/IP模型、协议族与UDP编程
  • 【新启航】3D 逆向抄数的三维能力架构:数据采集工具操作 × 几何处理算法应用 × 行业场景适配技能
  • 微硕WINSOK大功率MOS管 WSF3085在汽车关键系统中的创新应用
  • 【世纪龙科技】汽车专业数字化课程资源包-虚拟仿真实训资源建设
  • 2025大学生必考互联网行业证书排名​
  • Nginx 全攻略:从部署到精通的实战指南(CentOS 环境)
  • 腾讯混元世界模型Voyager开源:单图生成3D世界的“核弹级”突破,游戏、VR、自动驾驶迎来新变量
  • Nature | 克隆拷贝数多样性影响肺癌生存
  • 大模型适配国产化服务器昇腾(300I DUO)
  • 多人语音分离模型效果展示与本地部署实践
  • spring boot启动
  • CAN诊断箱调试报告
  • Kubernetes 高级健康检查与存储卷详解
  • 质量安全管控如何实现事前预防?
  • hadoop 框架 jar下载
  • Python入门教程之类型转换
  • 别被亚马逊FBA拖垮!合规入仓+高效履约,全链路痛点破解指南来了