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

LeetCode热题100——移动零

解法一:统计零 + erase/remove

💡 解题思路

这道题要求把数组中的所有0移到末尾,同时保持非零元素原来的相对顺序。

第一种方法可以分成三步:

  1. 遍历数组,统计一共有多少个0
  2. 使用remove()配合erase()删除数组中的所有0
  3. 根据统计出的数量,在数组末尾补回相同数量的0

例如:

原数组:[0, 1, 0, 3, 12] 零的数量:2 删除所有零:[1, 3, 12] 末尾补两个零:[1, 3, 12, 0, 0]

🧱 知识点卡片

🧹移动待保留元素

remove(nums.begin(), nums.end(), 0)会把所有非零元素向前移动,并返回新的“逻辑结尾”。

它不会真正缩短vector,末尾仍然保留着不再需要的元素,因此还要配合erase()

✂️真正删除尾部区间

erase(new_end, nums.end())会真正删除从新逻辑结尾到原数组末尾的元素。

把两步合在一起就是:

nums.erase(remove(nums.begin(), nums.end(), 0), nums.end());

在末尾添加元素

nums.push_back(0)会在vector的末尾添加一个0

循环执行count次,就能补回之前删除的所有零,同时保持数组长度不变。

💻 代码实现

class Solution { public: void moveZeroes(vector<int>& nums) { int count = 0; // 统计数组中零的数量 for (int i = 0; i < nums.size(); ++i) { if (nums[i] == 0) { count++; } } // remove 把非零元素向前移动 // erase 真正删除末尾不再需要的区间 nums.erase( remove(nums.begin(), nums.end(), 0), nums.end() ); // 在数组末尾补回相同数量的零 for (int i = 0; i < count; ++i) { nums.push_back(0); } } };

✅一句话总结:先数出零的数量,再删除所有零,最后把相同数量的零补到数组末尾。

解法二:双指针

💡 解题思路

使用两个位置:

  • i:从左到右扫描整个数组,寻找非零元素。
  • next:指向下一个非零元素应该放置的位置。

nums[i] != 0时,就交换nums[i]nums[next],然后把next向右移动一位。

[0, 1, 0, 3, 12]为例:

开始: [0, 1, 0, 3, 12] next = 0 遇到 1: [1, 0, 0, 3, 12] next = 1 遇到 3: [1, 3, 0, 0, 12] next = 2 遇到 12: [1, 3, 12, 0, 0] next = 3

每次发现非零元素,就把它放到前面的正确位置。扫描结束后,所有非零元素都保持原顺序排列在前面,零自然被交换到末尾。

🧱 知识点卡片

👉next 指针

next表示“下一个非零元素应该放在哪里”。

next左边都是已经处理好的非零元素;只有成功放入一个非零元素后,next才会加 1。

🔄swap()

swap(nums[i], nums[next])会交换当前位置和目标位置的元素。

如果i == next,相当于元素与自己交换,不会影响结果;因此代码不需要额外判断两个下标是否相同。

💻 代码实现

class Solution { public: void moveZeroes(vector<int>& nums) { // next 指向下一个非零元素应该放置的位置 int next = 0; // i 负责从左到右扫描整个数组 for (int i = 0; i < nums.size(); ++i) { if (nums[i] != 0) { // 把当前非零元素移动到前面的正确位置 swap(nums[i], nums[next]); // 下一个非零元素应该放到再右边一格 ++next; } } } };

✅一句话总结:用i寻找非零元素,用next标记它应该放置的位置;每找到一个非零元素就交换并移动next

🆚 方法对比

推荐使用双指针

解法一按照“统计、删除、补零”三个步骤完成,思路直观,也能保持非零元素的相对顺序。

解法二只需一次从左到右的扫描,通过交换原地完成移动,步骤更紧凑,也更符合这道题想考察的双指针思想。

http://www.cnnetsun.cn/news/3868191.html

相关文章:

  • Oracle数据库Shared Pool与Buffer Cache内存优化实战
  • 手机直供电改造:解决移除电池后重启黑屏的硬件方案
  • MySQL数据库核心操作与优化实战指南
  • MySQL事务ACID特性与InnoDB日志机制详解
  • 揭秘2024网站建设云尚网络如何通过匠心独运打造行业标杆品牌并赋能企业数字化转型
  • 3分钟极速配置:告别GitHub网络延迟的终极加速方案
  • Sigmoid激活函数:从神经网络基础到梯度消失问题解析
  • 计算机毕业设计之基于spring boot的外卖平台小程序
  • Ubuntu 22.04 安装 SSH 服务与远程调试环境配置指南
  • 西宁网站建设开发怎么选?避开这些坑才是真省钱,本地团队告诉你大实话
  • AI 焦虑下,前端该何去何从
  • HarmonyOS 7 / API 26 折叠屏断点适配:页面宽度变化后列表、详情和弹窗怎么稳定
  • MinIO对象存储:轻量级云原生解决方案部署指南
  • 深入解析黑龙江省建设厅网站如何助力百姓办事与行业发展
  • nnUNet and its customization
  • FigmaCN:3分钟实现Figma完整中文界面的终极指南
  • Redis双写一致性:从延时双删到分布式锁与CDC的解决方案
  • ChatGPT教育插件实战指南:从原理到教学应用全解析
  • 测测动次打次我说的
  • 做青岛商网站建设,如何让企业官网从“能看”到“好用”?资深运营人的掏心窝子建议
  • 网站流量月增40%实战分析:从数据拆解到可复现增长策略
  • 品牌域名回购注意事项
  • Unity TextMesh Pro中文显示“口口”乱码:原理剖析与全平台解决方案
  • 龙华新区网站建设指南:如何打造真正转化率高、用户体验佳的数字化品牌门面
  • DeepSeek LeetCode 3821. 二进制中恰好K个1的第N小整数 Python3实现
  • QKeyMapper:Windows平台终极跨设备按键映射解决方案
  • 西班牙智慧灌溉阀控器物联网卡:本土网络低功耗适配
  • Unity动态天气系统UniStorm:从体积云渲染到游戏玩法集成
  • Unity启动画面全解析:从内置配置到自定义加载场景的实战优化
  • 数据库期末急救指南:核心概念、SQL实战与高频考点解析