LeetCode 283:移动零
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
【示例】
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
【说明】
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
解题
思路
双指针法,左指针依次遍历数组,当遇到0时,右指针从当前位置向后搜索,直到找到第一个不为0的值或到末尾,如果不在末尾,则交换左右指针的值,左指针继续遍历。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for (int i=0,j=0; i< nums.size();++i){
if (nums[i]==0){
for (j=i+1; j<nums.size() && nums[j]==0; ++j);
if (j < nums.size()) swap(nums[i], nums[j]);
}
}
}
};
优化
快指针依次遍历数组,快指针指向的值等于0时,慢指针停下,当快指针不等于0时交换慢指针和快指针的值,同时慢指针递增1。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for (int f=0, s=0; f<nums.size(); ++f){
if (nums[f]!=0){
swap(nums[f],nums[s]);
++s;
}
}
}
};