给你一个整数数组 nums
。如果任一值在数组中出现 至少两次 ,返回 true
;如果数组中每个元素互不相同,返回 false
。
示例 1:
输入:nums = [1,2,3,1]
输出:true
示例 2:
输入:nums = [1,2,3,4]
输出:false
示例 3:
输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/contains-duplicate
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
自己第一道题,挑战失败!!!!
想法一步步来,开始想的是拿出一个数挨个和剩下比较,看是否有相等,直觉比较次数太多,放弃上手。
之后看了下标签,有排序字眼,排序后进行比较相邻元素,可尝试。排序算法只记得一种Bubble,尴尬了,印象他是流量款,最基础,能拍,但时间复杂度比较高O(n^2)。不过其他的插入排序,堆排序,桶排序都忘干净了,刚刷完视频过来,所以通过刷题一点点积累方法吧。
1、冒泡尝试
class Solution {
public boolean containsDuplicate(int[] arr) {
for(int i = 0; i < arr.length - 1; i++){
for(int j = 0; j < arr.length - 1 - i; j++){
if(arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
boolean flag = false;
for(int i = 0; i < arr.length - 1; i++){
if(arr[i] == arr[i + 1]){
flag = true;
break;
}
}
return flag;
}
}
示例测试通过,提交执行结果:超出时间限制查看数据,长长长长长长长长长长,作为小白的我,想也应该是时间复杂度太高了。
有点尬尴 ,其他代码和想法想不出来,刚开始的话,积累一些编程范式和基本套路也好,就去看题解了。
2、Arrays.sort()排序后比较相邻元素
class Solution {
public boolean containsDuplicate(int[] nums){
Arrays.sort(nums);
boolean flag = false;
for(int i = 0; i < nums.length - 1; i++){
if(nums[i] == nums[i + 1]){
flag = true;
break;
}
}
return flag;
}
}
发现用的Arrays.sort()排序,自己也想过直接将数组元素存入List,但忘记排序方法如何调用了,有点可惜,基础有待加强。打开IDEA,查看了这个方法是 DualPivotQuicksort.sort()双轴快速排序,既然题解直接用了,咱也就当个技巧,站在巨人肩膀上能眺得更远,心存感激。
3、哈希表
使用add()方法,能添加不重复元素,并且可添加时返回true,已有元素,不能重复添加时返回false。速度快,若用实现类用TreeSet代替HashSet会降低速度,因为TreeSet会有自然排序耗时,而HashSet用Hash算法得到数据的Hash值,之后找到数据在Hash表中的位置,判断是否可存入即可。
class Solution {
public boolean containsDuplicate(int[] nums){
Set<Integer> set = new HashSet<Integer>();
for(int i : nums){
if(!set.add(i)){
return true;
}
}
return false;
}
}