65 - 存在重复元素
题目
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
示例 1:
输入: [1,2,3,1] 输出: true
示例 2:
输入: [1,2,3,4] 输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2] 输出: true
解答
只要有一样的元素,就输出true。那么可以用哈希表存一下已经有的内容,也可以用indexof
来找相同的值,也可以排序后查一下后面有没有一样的值
这次题目很刺激,一下子想到了三种解法,还都写出来了,感觉自己很酷哈~😎😎
indexof
从上一个题目解答获得的灵感,查一下后面有没有相同的数
var containsDuplicate = function (nums) {
for (let i = 0; i < nums.length - 1; i++) {
if (nums.indexOf(nums[i], i + 1) !== -1) {
return true;
}
}
return false;
};
Runtime: 1584 ms, faster than 9.87% of JavaScript online submissions for Contains Duplicate.
Memory Usage: 37.2 MB, less than 94.12% of JavaScript online submissions for Contains Duplicate.
func containsDuplicate(nums []int) bool {
for i := 0; i < len(nums)-1; i++ {
for j := i + 1; j < len(nums); j++ {
if nums[i] == nums[j] {
return true
}
}
}
return false
}
Runtime: 784 ms, faster than 5.13% of Go online submissions forContains Duplicate.
Memory Usage: 6.4 MB, less than 100.00% of Go online submissions for Contains Duplicate.
go没有现成的indexOf
函数,只能手写一个。。
倒不如先排序一下。
sort
var containsDuplicate = function (nums) {
nums.sort()
for (let i = 0; i < nums.length; i++) {
if (nums[i] == nums[i + 1]) {
return true
}
}
return false
};
Runtime: 96 ms, faster than 24.68% of JavaScript online submissions for Contains Duplicate.
Memory Usage: 38.5 MB, less than 91.18% of JavaScript online submissions for Contains Duplicate.
func containsDuplicate(nums []int) bool {
sort.Ints(nums)
for i := 0; i < len(nums)-1; i++ {
if nums[i] == nums[i+1] {
return true
}
}
return false
}
Runtime: 24 ms, faster than 49.49% of Go online submissions forContains Duplicate.
Memory Usage: 6.4 MB, less than 100.00% of Go online submissions for Contains Duplicate.
go的做法要用到sort
包,而且遍历的长度要-1
,不然会导致panic,因为切片指向了一个不存在的地方。
但js里面不需要管那么多,因为即使指了数组之外,也是undefined
,也是不想等的。
map
var containsDuplicate = function (nums) {
let data = new Map()
for (let i = 0; i < nums.length; i++) {
if (data.has(nums[i])) {
return true
}
data.set(nums[i], true)
}
return false
};
Runtime: 60 ms, faster than 91.75% of JavaScript online submissions for Contains Duplicate.
Memory Usage: 41.6 MB, less than 41.18% of JavaScript online submissions for Contains Duplicate.
这个方法速度贼快哈
func containsDuplicate(nums []int) bool {
data := make(map[int]bool)
for i := 0; i < len(nums); i++ {
if _, ok := data[nums[i]]; ok {
return true
}
data[nums[i]] = true
}
return false
}
Runtime: 20 ms, faster than 87.06% of Go online submissions forContains Duplicate.
Memory Usage: 9.2 MB, less than 25.00% of Go online submissions forContains Duplicate.
set
作者:pandawakaka
用set去重后,判断一下两者长度是否相同,很酷的解法哈。
var containsDuplicate = function (nums) {
data = new Set(nums)
if (data.size === nums.length) {
return false
} else {
return true
}
};
Runtime: 56 ms, faster than 97.51% of JavaScript online submissions for Contains Duplicate.
Memory Usage: 40.9 MB, less than 61.76% of JavaScript online submissions for Contains Duplicate.
set的长度要用size
来得到,和数组有些不同哈
也可以一边塞一边查有没有类似的
var containsDuplicate = function (nums) {
set = new Set()
for (const item of nums) {
if (set.has(item)) {
return true
} else {
set.add(item)
}
}
return false
};
Runtime: 68 ms, faster than 70.50% of JavaScript online submissions for Contains Duplicate.
Memory Usage: 40.3 MB, less than 70.59% of JavaScript online submissions for Contains Duplicate.
这个好像比map要好一点哈,毕竟不用多存一个true浪费空间。
感觉和array的indexof思路差不多,但就是比array快😂
go里面同样没有set,实现的方法是用map,而这就和map的解法重复了,因此就不写了。
Last updated
Was this helpful?