283. 移动零
283. 移动零
难度:easy
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解题思路
方法一:两次遍历,快慢指针
使用i遍历整个数组,使用j记录非0的数组。当i指向的数字非0时就复制给j位置。
最后将j后面的位置全部填充为0
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j = 0;
//j位置的元素都为非0元素
for(int i = 0; i < nums.size(); i++){
if(nums[i] != 0){
nums[j] = nums[i];
j++;
}
}
// 将后面填充上0
for(int i = j; i < nums.size(); i++){
nums[i] = 0;
}
}
};
方法二:一次遍历,交换法
利用快排的思想,j之前的元素表示非零元素并且已经有序。
遍历i个元素,如果i非0,就和j交换,同时j前进一位
- Your runtime beats 91.07 % of cpp submissions
- Your memory usage beats 100 % of cpp submissions (8.9 MB)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j = 0;
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] != 0)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
j++;
}
}
}
};