我最初的思路:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
{
if(nums[i]==0)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[j]!=0)
{
swap(nums[i],nums[j]);
break;
}
}
}
}
}
};
发现时间复杂度太大了,觉得不太好。又想到了另外一个方法。
法2:双指针,i用来找非0元素,j用来指向下一个可以存放非零元素的位置
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int i=0,j=0;
while(i<nums.size())
{
if(nums[i]!=0)
{
nums[j++]=nums[i];
}
i++;
}
//剩下全部填0
while(j<nums.size())
{
nums[j++]=0;
}
}
};
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//双指针(快慢指针),想法就是把需要的元素挑出来,从头开始按顺序放
int j=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=val)
{
nums[j++]=nums[i];
}
}
return j;
}
};
class Solution {//双指针:快指针j和慢指针i
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() < 2) return nums.size();
int j = 0;
for (int i = 1; i < nums.size(); i++)
if (nums[j] != nums[i])
nums[++j] = nums[i];
return ++j;
}
};