移动零&移除元素&删除排序树组中的重复项(快慢指针)

在这里插入图片描述
我最初的思路:

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;
}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值