【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

5分钟部署Glyph视觉推理,智谱开源模型让长文本处理更简单

5分钟部署Glyph视觉推理,智谱开源模型让长文本处理更简单 你是否遇到过这样的问题:想用大模型处理一份50页的PDF技术文档,但模型直接报错“超出上下文长度”?或者需要分析一份包含数百张图表的财报,传统文本模型根本无法理解其中的表格结构和趋势图?Glyph正是为解决这类长文本+多模态信息处理难题而生的视觉推理新范式。 它不走常规路——不硬堆参数、不盲目扩上下文,而是把文字“画”出来,再用视觉语言模型来“看”懂。这种思路既降低了硬件门槛,又保留了语义完整性。本文将带你从零开始,在5分钟内完成Glyph镜像部署,并亲手体验它如何把一整页密密麻麻的API文档,变成一张清晰可交互的视觉化知识图谱。 1. 为什么传统方法在长文本面前频频“卡壳” 1.1 文本模型的“内存天花板”有多低 我们先看一组真实数据:主流7B级文本大模型(如Qwen2-7B)在单张4090D显卡上,最大支持上下文通常在32K token左右。换算成实际内容: * 一篇中等长度的技术白皮书(约8000字)≈ 12K token * 一份标准上市公司年报(PDF转文本后)≈ 45K–120K token

By Ne0inhk
【Git】一篇文章带你入门Git

【Git】一篇文章带你入门Git

1. 初识 Git 1.1 Git 是什么? Git 是一个开源的分布式版本控制系统,用于高效地跟踪和管理项目代码的变更历史(不仅仅是代码,还有其它格式也是可以的~) 1.2 为什么要有 Git 在学习或者是工作的时候,比如编写各种文档,为了防止文档丢失,更改失误,我们不得不复制出一个副本,保留历史记录,方便找回历史记录,比如: “设计文档-v1” “设计文档-v2” “设计文档-v3” “设计文档-确定版” “设计文档-最终版” 每个版本有各自的内容,但最终会只有⼀份文档是需要被使用的,在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,文件就越来越多,不仅文件多,更重要的是,随着版本数量的不断增多,我们可能记不太清每一个版本具体修改的哪些内容,文档如此,我们编写的项目代码也如此! 那么,如何解决呢? 答:版本控制器 ,记录每次修改以及版本迭代的一个管理系统,目前,最主流的版本控制器就是 Git,

By Ne0inhk

GitHub 教育认证通过后如何领取 Copilot Pro

最近我通过了 GitHub 教育认证(Student Developer Pack),但是发现并没有立刻拿到 Copilot Pro。折腾了一番之后终于搞定了,这里记录一下过程,方便后面遇到同样问题的同学。 1. 教育认证通过 ≠ 立即开通 当你刚刚通过认证时,Student Pack 页面可能显示绿标,提示福利稍后开放,这时候需要等待几天到两周左右。 * 绿标:福利还在处理阶段(will be available soon)。 * 紫标:福利已经激活(benefits are now available)。 所以,如果你刚过认证但没看到 Copilot Pro,不用急,先等等。 2. 手动领取 Copilot Pro 即使福利已经激活,你也需要手动去领取: 👉 访问这个链接: https://github.com/github-copilot/

By Ne0inhk