LeetCode 217. 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.

Example 1:

Input: [1,2,3,1]
Output: true

Example 2:

Input: [1,2,3,4]
Output: false

Example 3:

Input: [1,1,1,3,3,4,3,2,4,2]
Output: true

2022.10.25 Java

最直观的用set的方法。

Runtime: 6 ms, faster than 97.06% of Java online submissions for Contains Duplicate.

Memory Usage: 54.5 MB, less than 94.65% of Java online submissions for Contains Duplicate.

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

回顾了一下之前的笔记,试图直接从array构造set感觉有点复杂,lc上没有可以直接用的api,就不写了。sort感觉时间复杂度也更高,算了。


正好遇到一个真的很easy的easy,就顺带做一下。题目要求返回看一个数组是否含有重复的数字,就又自然的想到了set,出现过就往里面塞,如果正好碰到set里有的就直接返回true了。非常简单,时空复杂度都和底层实现set的数据结构有关,这个还没去仔细了解,具体运行时间52ms,25.98%,空间16.5M,72.53%,怎么这么慢啊……

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        set<int> appeared;
        for (int i = 0; i < nums.size(); i++) {
            if (appeared.count(nums[i]) != 0) {
                return true;
            }
            appeared.insert(nums[i]);
        }
        return false;
    }
};

然后在discussion里看到了一行解决的方法,真是太妙了,其实也是很简单的思想,也用的set。因为有重复的数字,所以把这个数组塞到set里以后,原始数组的大小一定比set大,于是一行解决。结果发现,时间和空间性能都变差了……52ms,25.98%,18.1M,5.49%:

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {        
        return nums.size() > set<int>(nums.begin(), nums.end()).size();
    }
};

于是就勾起了我用sort试试看的心态,先把它排序以下,然后看有没有连续两个一样的数字。28ms,96.74%,11.4M,85.71%,看来sort还是很优秀啊!具体原因嘛……再说吧。

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {        
        sort(nums.begin(), nums.end());
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] == nums[i - 1]) {
                return true;
            }
        }
        return false;
    }
};

顺带复习了一下vector的sort,是要:sort(vec.begin(),vec.end()),自定义的话可以在后面加第三个参数function。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值