大家好,我是小卡皮巴拉
文章目录
目录
力扣题目:
题目描述
解题思路
解题要点
完整代码(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]);}} };
兄弟们共勉 !!!
码字不易,求个三连
抱拳了兄弟们!