
大家好,我是小卡皮巴拉
文章目录
目录
力扣题目:
题目描述
解题思路
解题要点
完整代码(C++)
兄弟们共勉 !!!
每篇前言
博客主页:小卡皮巴拉
咱的口号:🌹小比特,大梦想🌹
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。
力扣题目:
原题链接:283. 移动零 - 力扣(LeetCode)
题目描述
给定一个数组
nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]输出:[1,3,12,0,0]示例 2:
输入: nums =[0]输出:[0]
解题思路
类似于本题这样的数组分块问题,我们都可以采用“双指针”法
通过
cur和dest指针配合完成元素移动。
指针初始化:
cur指针用于遍历数组元素,初始值为 0,从数组第一个元素开始遍历。
dest指针标记已处理好的非零元素的最后位置,初始值为 -1。开始时未找到非零元素,初始化为 -1 便于后续逻辑,找到首个非零元素时,dest先自增为 0 再交换元素。遍历数组处理元素:
当
cur指针遍历数组时,对每个元素nums[cur]进行判断。若
nums[cur]不为 0,先将dest指针后移一位(++dest),再把nums[cur](当前非零元素)与nums[dest]交换,使非零元素放到dest指针位置,保持非零元素相对顺序。若
nums[cur]为 0,不交换,cur指针继续后移找下一个非零元素。得出最终结果:
cur指针遍历完数组后,非零元素移到数组前面且保持相对顺序,0 元素自然被移到末尾,因为交换中 0 元素会逐渐被 “挤” 到后面。
解题要点
双指针策略
定义与作用:
cur遍历数组元素,dest标记已处理非零元素末尾位置。初始化:
cur为 0 从首元素开始遍历,dest为 -1,遇首个非零元素时自增到 0。遍历交换逻辑
条件判断:
cur遍历中,nums[cur]不为 0 时进行交换。交换操作:
nums[cur]非 0,dest先自增,再与nums[cur]交换。零元素处理:
nums[cur]为 0 时,cur直接后移。复杂度控制
时间:仅一次遍历,时间复杂度 O(n)。
空间:常数级额外空间,空间复杂度 O(1)。
适用性拓展:适用于数组元素重排问题,如奇偶分离、移除特定值元素。
完整代码(C++)
class Solution { public:void moveZeroes(vector<int>& nums) {for(int cur = 0, dest = -1;cur < nums.size();cur++){if(nums[cur])//处理非零元素swap(nums[++dest],nums[cur]);}} };
兄弟们共勉 !!!
码字不易,求个三连
抱拳了兄弟们!


