59 去除重复元素(Remove Duplicate Numbers in Array)

59 去除重复元素(Remove Duplicate Numbers in Array),第1张

文章目录
    • 1 题目
    • 2 解决方案
      • 2.1 思路
      • 2.2 时间复杂度
      • 2.3 空间复杂度
    • 3 源码

1 题目

题目:去除重复元素(Remove Duplicate Numbers in Array)
描述:给一个整数数组,去除重复的元素。你应该做这些事:1.在原数组上 *** 作;2.将去除重复之后的元素放在数组的开头;3.返回去除重复元素之后的元素个数。不需要保持原数组的顺序。

lintcode题号——521,难度——easy

样例1:

输入:nums = [1,3,1,4,4,2]
输出:
[1,3,4,2,?,?]
4
解释:
1. 将重复的整数移动到 nums 的尾部 => nums = [1,3,4,2,?,?].
2. 返回 nums 中唯一整数的数量  => 4.
事实上我们并不关心你把什么放在了 ? 处, 只关心没有重复整数的部分.

样例2:

输入:nums = [1,2,3]
输出:
[1,2,3]
3
2 解决方案 2.1 思路

  使用两个指针,一个指针从左向右指示当前的需要填充的位置,一个指针用于从左向右找不重复的数,然后不断地将不重复的数向前填充即可。

2.2 时间复杂度

  时间复杂度为O(n)。

2.3 空间复杂度

  空间复杂度为O(1)。

3 源码

细节:

  1. 同向双指针法,left从左往右一步一步走,right从左往右依次寻找不重复的数,依次将不重复的数填充到left位置。
  2. 判断重复可以使用set数据结构。

C++版本:

/**
* @param nums: an array of integers
* @return: the number of unique integers
*/
int deduplication(vector &nums) {
    // write your code here
    if (nums.empty())
    {
        return 0;
    }

    set duplicate;
    int left = 0;
    int right = 0;
    while (right < nums.size())
    {
        if (duplicate.find(nums.at(right)) == duplicate.end())
        {
            swap(nums.at(left), nums.at(right));
            duplicate.insert(nums.at(left));
            left++;
        }

        right++;
    }

    return left;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/872684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存