题解 | #数组中重复的数字#

public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
        // write code here
        unordered_set<int> s;
        for(int i=0; i<numbers.size(); i++){
            if(s.count(numbers[i])==0){
                s.insert(numbers[i]);
            }
            else return numbers[i];
        }
        return -1;
    }
};

set基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。

unordered_set基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。

一次循环依次遍历数组,并与查询hash表(hash表采用unordered_set容器,而不要采用set,unordered_set底层使用的vector+list开链法,理论查询时间O(1),set底层采用红黑树,查询时间稳定log(n)):1、hash表存在该数字,结束返回结果;2、hash表不存在该数字,将该数字加入hash表中;循环结束代表未找到,返回-1;

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务