目录
1. 题目解析
2. 算法原理
3.代码实现
题目:
力扣题目链接:移动零
1. 题目解析
题目截图如下:
不过要注意,这个移动题目要求是在原数组中原地操作,不能新额外开辟一个数组来修改。
2. 算法原理
这个原理可以称之为数组划分或数组分块,特点:给了一个数组,然后又给了一个指定的规则或标准,让我们在这个规则下把这个数组划分成若干个区间。
此题目就是,给了我们一个标准,就是把非0元素放在前面,0元素放在后面。
这道题目就可以通过双指针算法来解决(在数组中,可以利用数组下标充当指针。因为数组的特性,可以利用它的下标索引到里面的元素。)
结合起来,这个题目就可以主要分为两部分一部分是处理过的,一部分是未被处理的,但是处理过的因为制定的规则也要分为两部分:一部分是非0元素,一部分是0元素。
这里定义了两个指针dest和cur,它们的作用是:
- cur用来从左往右扫描数组,遍历数组。
- dest是代表着已经被处理的区间内,非0元素的最后一个位置。
所以就分成了三个区间:
cur再遍历数组时会遇到两种情况:
- 遇到0:cur向后移动一位,其他不做处理。
- 遇到非0元素:dest先加1(dest向后移动一位),然后交换dest+1之后的位置与非0元素的位置,再让cur向后移动一位。
3.代码实现
总结:如何做到(实现)?
cur从前往后遍历的过程中:
- 遇到0元素,cur++(直接让cur向后移动一位,其余不做处理)。
- 遇到非0元素,dest下一个位置的元素与cur当前指向的位置的元素交换,然后dest、cur都向后移动一位。
//实现代码
class Solution {
public:void moveZeroes(vector<int>& nums) {int dest = -1;//因为cur要遍历数组,并且无论什么情况都会往后移动1位//所以写成for循环来控制curfor (int cur = 0; cur < nums.size(); cur++) {//处理非0元素,若不为0,dest下一个位置与cur交换,dest再+1if (nums[cur]) { swap(nums[++dest], nums[cur]);//前置++可以实现让dest交换指向元素再向后移动1一位}}}
};
我们最后把代码提交一下:(题目链接)
制作不易,若有不足之处或出问题的地方,请各位大佬多多指教 ,感谢大家的阅读支持!!!