题目描述:
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true
。如果数组中每个元素都不相同,则返回 false
。
题目要求:
分析题目:
由题目我们可以知道,当数组中有重复的元素的时候(也就是两个元素相同),那么就要求返回true,如果没有相同的元素,那么就返回false
解题思路:
根据题目所给信息,我们可以使用两个for循环暴力求解,下面是求解过程:
var containsDuplicate = function(nums) {
for(i=0;i<nums.length;i++){
for(j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]){
return true
}
}
}
return false
};
虽然这样做也能做出来我们想要的结果,但是我们发现这样做时间、空间复杂度都特别的高,所以我们决定优化一下
优化解题思路:
我们第一次做的时候是因为使用了两个for循环,所以导致的问题,那么如果我们使用for循环的次数减少,那么肯定可以得到我们想要的结果。
因为题目说只要有重复的数组元素,那么就返回true,当这个数组进行升序(或者降序)排列的时候,我们只需要判断相邻两个是否是相等的,如果是,那么就返回true,如果不是就返回false
代码如下:
var containsDuplicate = function(nums) {
function des(a,b){
return a-b
}
nums.sort(des)
for(i=0;i<nums.length;i++){
if(nums[i]==nums[i+1])
return true
}
return false
};
但是这样的写法,其实还是含有for循环的,虽然他的时间提高了很多,但是我们发现其实还是不是很好的写法(毕竟才超过20%的人),所以再次进行优化
优化思路:
发现这道题好像可以使用哈希表来做,所以我们可以尝试使用哈希表
优化需要的知识:
因为哈希表是很久之前学过的东西,记忆都不是很清晰了,所以在这里复习一下哈希表的内容,回顾哈希表知识。
哈希表是根据关键码值(Key value)而直接进行访问的数据结构。说白了其实就是一种查找表,具体不多做阐述。
代码如下:
var containsDuplicate = function(nums) {
let map =new Map()
for(let i of nums){
if(map.has(i)){
return true
}else{
map.set(i,1)
}
}
return false
};