

1.TLE,分别找出不为0和为0的元素的下标,然后交换
class Solution {
public:
int findZero(vector<int>& nums)
{
// 找个数组中第一个元素为0的下标位置
for(int i = 0; i < nums.size(); i++)
if(nums[i] == 0) return i;
// 等于数组长度说明遍历完
return nums.size();
}
int findNotZero(vector<int>& nums)
{
// 找个数组中第一个元素不为0的下标位置
for(int i = 0; i < nums.size(); i++)
if(nums[i] != 0) return i;
// 等于数组长度说明遍历完
return nums.size();
}
void moveZeroes(vector<int>& nums)
{
// 双指针
int n = nums.size();
if(n == 0) return;
int i = findNotZero(nums), j = findZero(nums);
while(i != n)
{
swap(nums[i], nums[j]);
i = findNotZero(nums), j = findZero(nums);
}
}
};
2.双指针
class Solution {
public:
void moveZeroes(vector<int>& nums) {
// 双指针
// i:处理好的部分的尾部,j:未处理部分的头部
int n = nums.size(), i = 0, j = 0;
while(j < n)
{
if(nums[j] != 0)
{
swap(nums[i], nums[j]);
i++;
}
j++;
}
}
};