题目:
暴力方法:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int counts=0;//零的数量
int swapCounts=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==0){
counts+=1;
}
}
swapCounts=counts;
for(int i=0;i<nums.size();i++){
for(int j=nums.size()-1;j>i;j--){
if(nums[i]==0 && swapCounts>0 &&nums[j]!=0){
for(int k=i+1;k<=j;k++){//保持顺序移动
nums[k-1]=nums[k];
}
nums[j]=0;
swapCounts--;
i--;//防止零漏掉
break;
}
}
}
//非零部分进行排序 保持非零元素的相对顺序
//std::sort(nums.begin(),nums.end()-counts);
}
};
优化方法一:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int counts=0;//零的数量
int swapCounts=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==0){
counts+=1;
}
}
swapCounts=counts;
int i=0,j=nums.size()-1;
while(i>=0 && j <=nums.size()-1 && i<j){//i j 双指针
if(nums[i]!=0){
i++;
}
if(nums[j]==0){
j--;
}
if(nums[i]==0 && swapCounts>0 &&nums[j]!=0 &&i<j){
for(int k=i+1;k<=j;k++){//保持顺序移动
nums[k-1]=nums[k];
}
nums[j]=0;
swapCounts--;
if(swapCounts==0){
break;
}
}
}
//非零部分进行排序 保持非零元素的相对顺序
//std::sort(nums.begin(),nums.end()-counts);
}
};
优化方法二:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n=nums.size(),left=0,right=0;
while(right<n){//left指向 已完成 限制条件 的 结尾,right 指向 为遍历 序列的开始
if(nums[right]){//非零交换
swap(nums[left],nums[right]);
left++;
}
right++;//依次遍历完 为遍历的序列
}
}
};