给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
提示:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
NOTE:这道题和27.移动元素很相似,这题是将0移动到数组最后;
对于双指针法 可以看卡哥写的文章非常详细 代码随想录 (programmercarl.com)
双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作
移除元素 就是快指针遇到要移除的元素,慢指针不动,快指针继续移动,将下一个元素覆盖掉前一个元素,就达到了移除元素的效果;对于这题移动0,也是先将数组中的0全部用下一个元素覆盖掉,等待快指针遍历完数组,然后将慢指针后面的元素都赋值为0就行。
完整代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int SlowIndex = 0;
for(int FastIndex=0; FastIndex < nums.size() ; FastIndex++) {
if(nums[FastIndex] != 0) {
nums[SlowIndex++] = nums[FastIndex];
}
}
for(int i = SlowIndex ; i < nums.size() ; i++) {
nums[i] = 0;
}
}
};
快慢指针是一种常用的算法技巧,特别适用于数组和链表的操作。这种方法涉及两个指针(通常是数组的索引),一个移动得快,一个移动得慢,通过它们的相对运动来解决问题或优化性能。
1. 核心概念
- 快指针(
fastIndex
):通常用来遍历数组或链表,每次循环中都前进,不论条件是否满足。 - 慢指针(
slowIndex
):其移动基于特定的条件。当条件满足时,慢指针才前进,用来构建最终的结果或执行特定操作。
使用快慢指针时,典型的代码模式如下:
int slow = 0; // 慢指针初始化
for (int fast = 0; fast < n; fast++) { // 快指针遍历
if (condition) { // 满足特定条件
process(slow, fast); // 处理慢指针和快指针
slow++; // 慢指针前进
}
}