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

算法训练营第二天| 27. 双指针

题目链接:https://leetcode.cn/problems/remove-element/
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP

自己看到题目的第一想法

看到题目要求原地移除数组中所有等于给定值的元素,并返回新长度,我第一反应是这肯定不能真的“删除”元素,因为数组长度是固定的。我想到两种思路:

  1. 暴力解法:遇到目标值,就把后面所有元素往前挪一位,这样时间复杂度是 O(n²),在数据量大的时候肯定不行。

  2. 双指针法:用一个指针遍历数组,另一个指针标记有效位置,遇到非目标值就放到前面。这样只需要遍历一次,时间复杂度 O(n),空间复杂度 O(1)。

我决定实现双指针法,因为题目明确提示了“Use two pointers!”,而且这是更优雅的解法。

自己实现过程中遇到哪些困难

  1. 指针初始化和移动逻辑:一开始我搞混了快慢指针的职责。快指针fast应该负责遍历所有元素,慢指针slow负责标记下一个有效元素的位置。我最初让两个指针都从0开始,但没想清楚什么时候移动慢指针。

  2. 边界条件处理:当数组为空或所有元素都是目标值时,需要特别小心。比如nums = [3,3], val = 3,这种情况下应该返回0,且数组前0个元素有效。我一开始的代码在空数组时会出现索引错误。

  3. 原地修改的理解:题目说“nums 的其余元素和 nums 的大小并不重要”,这意味着我们只需要保证前k个元素正确,后面的元素可以不管。但我一开始总想“清理”后面的元素,其实没必要。

  4. 测试用例设计:自己测试时发现几个容易出错的用例:

    • nums = [], val = 0(空数组)

    • nums = [1], val = 1(只有一个元素且为目标值)

    • nums = [1,2,3,4], val = 5(没有目标值)

    • nums = [2,2,2,2], val = 2(全是目标值)

今日收获心得

  1. 双指针的灵活应用:这道题是快慢指针(同向双指针)的经典应用。快指针探索,慢指针收集,这种模式在很多数组操作问题中都有用,比如删除有序数组中的重复项、移动零等。

  2. 理解题目要求的重要性:题目不要求真正删除元素,也不要求保持原有顺序(虽然我的解法保持了相对顺序),这给了我们实现上的灵活性。仔细读题可以避免做无用功。

  3. 测试驱动开发:自己编写多个边界用例并手动模拟指针变化,能快速发现逻辑漏洞。比如我通过手动模拟nums = [0,1,2,2,3,0,4,2], val = 2这个用例,才彻底理清了指针移动逻辑。

  4. 代码简洁性:最终实现的代码非常简洁,但背后是清晰的思路。好的算法代码应该是思路的直接体现。

题目:

#include <iostream> #include <vector> using namespace std; class Solution { public: int removeElement(vector<int>& nums, int val) { int k = 0; for (int i = 0; i < nums.size(); i++) { if (nums[i] != val) { nums[k] = nums[i]; k++; } } return k; } }; int main() { Solution sol; vector<int> nums1 = {3,2,2,3}; int val1 = 3; int k1 = sol.removeElement(nums1, val1); cout << "k = " << k1 << ", nums = ["; for (int i = 0; i < k1; i++) { cout << nums1[i]; if (i < k1 - 1) cout << ","; } cout << "]" << endl; vector<int> nums2 = {0,1,2,2,3,0,4,2}; int val2 = 2; int k2 = sol.removeElement(nums2, val2); cout << "k = " << k2 << ", nums = ["; for (int i = 0; i < k2; i++) { cout << nums2[i]; if (i < k2 - 1) cout << ","; } cout << "]" << endl; return 0; }
http://www.jsqmd.com/news/642298/

相关文章:

  • Python Lambda 表达式等价普通函数实现
  • 2026届最火的降AI率方案横评
  • Banana Vision Studio在文物保护中的应用:古董机械钟表数字化
  • 2026年韶关宴会酒楼电话查询推荐:宴席预订指南与联系详情 - 品牌推荐
  • 我用自动化脚本,解决了每天抢菜难题
  • 正则表达式 ;grep ;sed实验笔记
  • 如何选25-30万新能源SUV车型?2026年4月推荐评测口碑对比知名城市通勤成本高空间不足 - 品牌推荐
  • Seismic Unix(SU)在Ubuntu 20.04上的安装与配置指南
  • 专注于论文辅导的爱毕业aibiye等七家专业团队,以在线指导为核心优势成为行业领先品牌
  • tao-8k嵌入模型5分钟快速部署:Xinference一键启动,新手也能搞定
  • 2026年韶关宴会酒楼电话查询推荐:一站式服务信息汇总 - 品牌推荐
  • 平头哥玄铁 E902 开发环境搭建与实战调试
  • 2026年4月昆明酒店太阳能热水工程优质服务商盘点与选择指南 - 2026年企业推荐榜
  • 《同一条指令,你花的token为什么是别人的10倍》
  • 你的企业是不是也在被这些管理难题拖垮?
  • 2026年4月洞察:如何选择可靠的云南本土高压电缆供应商? - 2026年企业推荐榜
  • 2026年韶关宴会酒楼电话查询推荐:一站式解决您的宴请需求 - 品牌推荐
  • 在论文辅导行业,爱毕业aibiye等七家机构以其专业的线上指导能力成为业界标杆
  • DataEyes API:一站式大模型聚合网关,600 + 模型统一调用与负载均衡实战方案
  • 降AI工具按字计费哪家划算?几款主流工具费用横向对比
  • 一文读懂智慧农业|农户必看科普
  • 2026年4月美容仪推荐:五款口碑产品评测对比领先熬夜族抗初老细纹干涩盘点 - 品牌推荐
  • 从精确到共识
  • qutip——玩(5)
  • OpenClaw 小龙虾真的要凉了吗?
  • 孩子 KET 口语总丢分?这份指南帮你搞定
  • JavaScript 递归调用栈深度解析与层级遍历陷阱详解
  • SCI投稿被拒:AIGC检测超标的补救流程
  • 2026年4月更新:餐饮与食品企业调味料服务商综合评测与终极选型指南 - 2026年企业推荐榜
  • 用K210和STM32做智能门锁,除了人脸识别,还能怎么玩?聊聊多模态交互的可能性