题目:
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。