题目描述
最开始拿到这道题,我的想法是两层遍历,第一层遍历是遍历当前数组的每一个数字,然后第二层遍历是当前数字的下一位,下下位,也就是每次遍历的次数都减1。代码的呈现为:
/**
* @param {number[]} nums
* @return {boolean}
*/
var containsDuplicate = function(nums) {
for(let i=0;i<nums.length;i++){
for(let j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]){
return true;
}
}
}
return false; //这个一定不能省略哦,这是一个返回结果,偷懒不写是会返回undefined的哦
};
时间复杂度为O(NN)
第二个循环遍历是等差数列,第一次循环n-1次,第二次循环n-2次,第三次循环n-3次,一直到1。因此为n-1+n-2+n-3…+1 = n(n-1)/2,n趋于无穷大时,-1是没有影响的,/2是没有影响的,所以时间复杂度为O(N*N)。
题解的解题思路有两种:
方法一:排序
先按从小到大排序,相邻两个元素再对比
var containsDuplicate=function(nums){
nums.sort((a,b)=>a-b); //从小到大排序
const n=nums.length;
for(let i=0;i<n-1;i++){
if(nums[i]==nums[i+1]{
return true;
}
}
return false;
}
- 时间复杂度为O(N log N),其中N为数组的长度,需要对数组进行排序
- 空间复杂度为O(log N)
方法二:哈希表
对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。
var containsDuplicate=function(nums){
const set =new Set();
for(const x of nums){
if(set.has(x)){
return true;
}
set.add(x);
}
return false;
}
- 时间复杂度为O(N),其中N为数组的长度
- 空间复杂度为O(N),其中N为数组的长度
看到下面的评论还有一种很新型的解决方法:
利用Set去重机制判断长度是否减少
var containsDuplicate = function (nums) {
return nums.length > new Set(nums).size
};