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

【LeetCode_27】移除元素

刷爆LeetCode系列

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

LeetCode27题:

github地址

有梦想的电信狗

前言

本文用C++实现LeetCode 第27题


题目描述

题目链接:https://leetcode.cn/problems/remove-element/

在这里插入图片描述


在这里插入图片描述

题目思路分析

目标分析

  1. 将数组中等于val的元素移除
  2. 原地移除,意味着时间复杂度为O(n),空间复杂度为O(1)
  3. 返回nums中与val值不同的元素个数

思路:双指针

  • src:用于扫描元素,从待扫描元素的第一个开始,因此初始下标为0

  • dst:指向数组中,最后一个位置正确的元素的下标,因此初始值为-1

  • count:记录赋值的次数,赋值的次数即为数组中与val值不同的元素个数,初始值为0

操作

  • nums[src] != val 时,说明:src位置的数无需被去掉,将其放在dst的下一个位置
    • dst先++,指向可以放入下一个无需被删除的元素的位置
    • nums[dst]赋值放入元素,之后src++
    • 计数器count++
  • nums[src] == val 时,说明src位置的数需要被去掉,src++略过该元素。

在这里插入图片描述

代码实现

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

算法代码优化

  • 时间复杂度O(n)
  • 空间复杂度O(1)

通过观察我们发现

  • dstcount自增的次数一样,且初值分别为0和-1,因此count == dst + 1
  • while循环内,if和else逻辑中,都执行了src++,因此ifelse中的src++可以省略,直接将src在循环中++
 // 优化版
int removeElement(vector<int>& nums, int val) {int src = 0, dst = -1;while(src < nums.size()){if(nums[src] != val){++dst;nums[dst] = nums[src];}++src;}return dst + 1;
}
  • 利用前置和后置++的特性最终优化,但不推荐这么写,因为算法的可读性下降了
class Solution {
public:int removeElement(vector<int>& nums, int val) {int src = 0, dst = -1;while(src < nums.size()){if(nums[src] != val)nums[++dst] = nums[src++];else++src;}return dst + 1;}
};

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

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

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


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

http://www.xdnf.cn/news/19275.html

相关文章:

  • Ubuntu中通过SSH克隆Windows的远程Git仓库(局域网中挺有用)
  • 对于牛客网—语言学习篇—编程初学者入门训练—复合类型:二维数组较简单题目的解析
  • Unity核心概念①
  • 准备机试--图【y总版】[重要]【最短路】
  • 三重积分的对称性
  • shell编程-核心变量知识
  • 面试专栏
  • Agent实战教程:LangGraph结构化输出详解,让智能体返回格式化数据
  • 第N个丑数
  • 文件夹和文件一键加密,保护你的隐私
  • CRM、ERP、HRP系统有啥区别?
  • 本地运行 Ollama 与 DeepSeek R1 1.5B,并结合 Open WebUI 测试
  • 安卓编程 之 线性布局
  • 数组去重【JavaScript】
  • 基于 MyBatis-Plus 拦截器实现锁定特殊数据(二)
  • kmp 算法
  • 42-Ansible-Inventory
  • 模式组合应用-组合模式
  • SpringAI应用开发面试剧本与技术知识全解析:RAG、向量数据库、多租户与企业落地场景
  • DbVisualizer:一款功能强大的通用数据库管理开发工具
  • 1.8 Memory
  • Python 入门 Swin Transformer-T:原理、作用与代码实践
  • 05MySQL多表查询全解析
  • 使用axios封装post和get
  • RLPD——利用离线数据实现高效的在线RL:不进行离线RL预训练,直接应用离策略方法SAC,在线学习时对称采样离线数据
  • unity学习——视觉小说开发(二)
  • 【系统分析师】高分论文:论软件的系统测试及应用
  • 宽带有丢包,重传高的情况怎么优化
  • 2025板材十大品牌客观评估报告—客观分析(三方验证权威数据)
  • 【电力电子】MCP602运算放大器测交流电压(120VAC/230VAC),带直流偏置2.5V,比例:133.5:1