LeetCode-删除重复项

Tips

  使用vector.size()时,在for循环中要写i<size()不要写i<size()-1。因为当vectorsize为0时,size()函数返回值是无符号整型,这时vec.size()-1是一个正数,会导致*vec[i]*访问越界。

##题解
  首先考虑了暴力解法,两个循环寻找相等的元素,找到后将其就地改为-1,记录下个数。再一次循环把不是-11的元素(随意值)放在数组的末尾。(此处默认了输入元素中不含有-11)。

#include "iostream"
#include "vector"
class Solution {
public:
	void swap(int i,int j)
	{
	    int temp=0;
	    temp=i;
	    i=j;
	    j=temp;
	}
	int removeDuplicates(vector<int>& nums) {
	    int len=nums.size();
	    int cnt=0;
	    for(int i=0;i<len-1;i++){
	        for(int j=i+1;j<len;j++){
	        if(nums[j]==nums[i]){
	                 nums[j]=-11;
	                cnt++;
	            }
	        }
	    }
	    while(cnt)
	    {
	        for(int k=0;k<len;k++)
	        {
	            if(nums[k]=-11)
	            swap(nums[k],nums[len-cnt]);
	            cnt--;
	        }
	    }
	        return cnt;
	}
};

  这样的做法明显时间复杂度超时。题解给出了相当好用的快慢指针的解法。

#include "iostream"
#include "vector"

class Solution
{
	int removeDuplicates(vector<int>& nums)
	{
		int len=nums.size();
		if(0==len)return 0;
		int i,j;
		for(i=0,j=i+1;j<len;j++)
		{
			if(nums[j]!=nums[i])
				i++;
				nums[i]=nums[j];
		}
		return i+1;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值