给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
用了个比较笨的办法,先给所给的数组进行排序,在这我用了快排。依次使用后一个元素与前一个元素做差,如果差值为0,则是重复元素。
还有两种办法:一是利用Go中Map值不能重复的特性去做,还有一种就是两个循环挨个比较,但是时间复杂度O(
n
2
n^2
n2)。
![](https://img-blog.csdnimg.cn/20190725221417347.png)
看来是我太菜了。
func containsDuplicate(nums []int) bool {
quicksort(nums)//对数组进行排序
for i:=1;i<len(nums);i++{
//有序序列相邻元素做差为0则相等
if(nums[i-1]-nums[i]==0){
return true
}
}
return false
}
//快速排序
func quicksort(values []int) {
if len(values) <= 1 {
return
}
mid, i := values[0], 1
head, tail := 0, len(values)-1
for head < tail {
if values[i] > mid {
values[i], values[tail] = values[tail], values[i]
tail--
} else {
values[i], values[head] = values[head], values[i]
head++
i++
}
}
values[head] = mid
quicksort(values[:head])
quicksort(values[head+1:])
}
更新:使用Map中键不能重复的特性
func containsDuplicate(nums []int) bool {
flag:=false //结果
numMap:=make(map[int]int)
for _,v:=range nums{ //将数组中的元素作为map的Key
numMap[v]=1//随便给个值,在这里value不重要
}
if len(numMap)!=len(nums){//如果map的大小小于数组长度,则存在重复元素
flag=true
}
return flag
}
效果有所改善32ms