【LeetCode_27】移除元素

【LeetCode_27】移除元素

刷爆LeetCode系列

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)
classSolution{public:intremoveElement(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在循环中++
// 优化版intremoveElement(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;}
  • 利用前置和后置++的特性最终优化,但不推荐这么写,因为算法的可读性下降了
classSolution{public:intremoveElement(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;}};

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

分享到此结束啦
一键三连,好运连连!
你的每一次互动,都是对作者最大的鼓励!征程尚未结束,让我们在广阔的世界里继续前行! 🚀

Read more

基于飞算JavaAI的在线图书借阅平台设计与实现(深度实践版)

基于飞算JavaAI的在线图书借阅平台设计与实现(深度实践版)

摘要: 本文以从概念到落地,完整构建一个“在线图书借阅平台”的全过程。文章不仅覆盖了环境配置、需求分析、接口设计、数据库建模等基础流程,更着重于展示AI自动生成的项目核心代码,并在此基础上进行了详尽的功能扩展和代码优化。通过对用户管理、图书管理、借阅与归还等关键业务模块的详细代码实现与注释,本文旨在全面、深入地展现飞算JavaAI在真实项目开发中的强大能力,探讨其如何重塑传统Java开发范式,显著提升开发效率与代码质量。 一、引言 在软件工程领域,随着业务逻辑的日益复杂化和市场对产品迭代速度的严苛要求,传统的纯手动编码模式正面临前所未有的挑战。开发周期长、人力成本高、代码质量参差不齐、技术债累积等问题,成为制约项目成功的重要因素。正是在这样的背景下,人工智能辅助编程(AI-Assisted Programming)应运而生,它通过将大型语言模型与软件工程知识深度融合,旨在自动化处理开发流程中的重复性、模式化任务,使开发者能够聚焦于更具创造性的核心业务逻辑。 飞算科技推出的飞算JavaAI,正是这一变革浪潮中的杰出代表。它作为一款深度集成于IntelliJ IDEA的智能插件,能够

By Ne0inhk
JAVA最新版本详细安装教程(附安装包)

JAVA最新版本详细安装教程(附安装包)

目录 文章自述 一、JAVA下载 二、JAVA安装 1.首先在D盘创建【java/jdk-23】文件夹 2.把下载的压缩包移动到【jdk-23】文件夹内,右键点击【解压到当前文件夹】 3.如图解压会有【jdk-23.0.1】文件 4.右键桌面此电脑,点击【属性】 5.下滑滚动条,点击【高级系统设置】 6.点击【环境变量】 7.找到系统变量(S),然后点击【新建】 8.输入变量名和变量值 9.确认无误,点击【确定】 10.继续点击系统变量下的【新建】 11.输入变量名和变量值

By Ne0inhk
Java Web 疫情打卡健康评测系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

Java Web 疫情打卡健康评测系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 近年来,全球范围内的突发公共卫生事件频发,疫情防控成为各国政府和社会关注的重点。传统的人工健康打卡和疫情监测方式效率低下,数据统计和分析滞后,难以满足实时监控和快速响应的需求。随着信息技术的快速发展,利用数字化手段构建高效、精准的疫情健康评测系统成为解决这一问题的有效途径。该系统能够实现个人健康信息的快速采集、动态监测和智能分析,为疫情防控提供数据支持。关键词:疫情防控、健康评测、数字化、数据采集、动态监测。 本系统基于SpringBoot2框架构建后端服务,采用Vue3作为前端开发框架,结合MyBatis-Plus实现高效数据持久化操作,数据库选用MySQL8.0以支持高性能数据存储与查询。系统主要功能包括用户健康打卡、体温异常预警、行程轨迹记录、数据可视化分析等,同时支持多角色权限管理,确保数据安全性和系统可扩展性。通过前后端分离的架构设计,系统具备良好的用户体验和响应速度,能够满足大规模用户并发访问的需求。关键词:SpringBoot2、Vue3、MyBatis-Plus、MySQL8.0、权限管理、数据可视化。 数据表 用户健康打卡数据表 用户健康打卡数据表用于

By Ne0inhk
JDK21安装与配置教程

JDK21安装与配置教程

文章目录 * 一、下载JDK * 1. 下载地址 * 2. 下载JDK21 * 二、JDK21安装及配置 * 1. 解压zip压缩包 * 2. 配置Java环境变量 * 2.1 打开系统属性设置 * 2.2 新建系统环境变量 * 2.3 编辑 PATH 环境变量 * 2.4 验证环境变量是否配置成功 一、下载JDK 1. 下载地址 华为云镜像下载地址: 地址 1(OracleJDK):https://repo.huaweicloud.com/java/jdk/ 地址 2(OpenJDK):https://mirrors.huaweicloud.com/openjdk/ 地址

By Ne0inhk