✨ 个人主页:在线OJ的阿川
💖文章专栏:OJ刷题入门到进阶
🌏代码仓库:
写在开头
现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论
目录
- 1.题目介绍
- 2.题目拆解:
- 3.具体详情
- 4.具体代码
1.题目介绍
难度:易
题目练习:移动零
题目信息:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
2.题目拆解:
本质上:是数组划分、数组分块问题
特点是:在制定的标准下,把数组划分成若干个区间
解决方法:双指针算法(利用数组下标来充当指针)
3.具体详情
两个指针作用:
cur:从左往右扫描数组,遍历数组
dest:已处理的区间内,非零元素的最后一个位置(即分界线)
具体如图1所示:
图1
三个区间:
具体如图2所示:
图2
如何做到:
cur从前往后遍历的过程中:1. 遇到零元素: cur++
2.遇到非零元素: swap(dest + 1, cur);
dest++,cur++;
4.具体代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int step = -1, cur = 0; cur < nums.size(); cur++)
if(nums[cur])
swap(nums[++step], nums[cur]);
}
};
好的,到此为止啦,祝您变得更强
道阻且长 行则将至 |
---|
个人主页:在线OJ的阿川大佬的支持和鼓励,将是我成长路上最大的动力 |