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;
	}
};
发布了36 篇原创文章 · 获赞 0 · 访问量 604

猜你喜欢

转载自blog.csdn.net/weixin_43199933/article/details/104911591