roufoo的博客

纸上学来终觉浅 绝知此事要躬行

Lintcode-521: Remove Duplicate Numbers in Array

题目要求:
Do it in O(n) time complexity.
Do it in O(nlogn) time without extra space.

解法1:用unordered_set。O(n)复杂度。

    int deduplication(vector<int> &nums) {
        unordered_set<int> s;
        int i=0, j=nums.size()-1;
        int count=0;        
        while(i<=j) {  //注意这里是i<=j
            if (s.count(nums[i])!=0) {
                int temp=nums[i];
                nums[i]=nums[j];
                nums[j]=temp;
                count++;
                j--;
            }
            else {
                s.insert(nums[i]);
                i++;
            }
        }
        return nums.size()-count;
    }

解法2:解法1的简单版。先统统往unordered_set里面丢,最后遍历它,放到num[]开头即可。

int deduplication(vector<int> &nums) {
    unordered_set<int> s;
    for (int i=0; i<nums.size(); ++i)
        s.insert(nums[i]);

    int index=0;
    for (auto i : s)
        nums[index++]=i;
    return index;    
}

解法3:排序后用双指针。一个快指针一直往前走,慢指针先不动。当快指针发现它指向的数和慢指针不一样,就把该数丢给慢指针的后一个位置。慢指针++。最后返回慢指针的值+1。这个思路很不错。

int deduplication(vector<int> &nums) {
   if (nums.size()==0) return 0;
   sort(nums.begin(), nums.end());
   int i=0, j=0;
   while(i<nums.size()) {
       if (nums[i]!=nums[j]) {
           nums[++j]=nums[i];
       }    
       ++i;
   }
   return j+1;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/roufoo/article/details/80352239
文章标签: LintCode
个人分类: C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Lintcode-521: Remove Duplicate Numbers in Array

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭