Contains Duplicate

Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.(给定一个整型数组,找出数组中是否含有任何副本元素,如果数组中出现两次以上的值则返回true,若数组元素值全是唯一的则返回false)

1.分析
数组处理问题,判断数组元素值是否全都唯一无重复。

2.个人解法

bool containsDuplicate(vector<int>& nums) 
{
    int numSize = nums.size();
    vector<int>counter(numSize, 0);

    int key;
    for (int i=0; i<nums.size(); ++i)
    {
        key = nums[i] % numSize;
        ++counter[key];
        if(counter[key] > 1)
            return true;
    }

    return false;
}

该解法没有解决哈希表映射过程中冲突的问题,比如输入数组为[1,3]时,两个元素都映射到下标为1的位置上,导致结果判断为true。

3.参考解法
(1)

bool containsDuplicate(vector<int>& nums) 
{
    if(0 == nums.size())
        return false;

    sort(nums.begin(), nums.end());
    for (int i=0; i<nums.size()-1; ++i)
    {
        if(nums[i] == nums[i+1])
            return true;
    }
    return false;
}

该方法是先将原数组排序,然后再遍历,如果存在相同元素,则排序后的数组中肯定存在两个相邻元素相等。整个算法的时间复杂度为O(n*logn),空间复杂度为O(1)。

(2)

public boolean containsDuplicate(int[] nums) {
    Set<Integer> set = new HashSet<>(nums.length);
    for (int x: nums) {
        if (set.contains(x)) return true;
        set.add(x);
    }
    return false;
}

该解法是在Java中借助哈希表实现,可以看出该算法既高效又简洁,时间和空间复杂度都为O(n).

4.总结
虽然刚开始就想到用哈希表实现是最高效的方法,但在C++实现过程中却发现很难用哈希表实现,即使C++有map容器,但无法像Java一样可以自动创建键值对,不得不说Java的库丰富而易用。

PS:

  • 题目的中文翻译是本人所作,如有偏差敬请指正。
  • “个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值