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

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<int> &nums) {
    // write your code here
    if (nums.empty())
    {
        return 0;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值