场景:
刷力扣题,今天做的是一道简单题,我笑得像一个孩子一样
问题描述:
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 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,否则返回false;
缺点:超时间,时间复杂度O(n^2)
public static boolean containsDuplicate(int[] nums) {
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++) {
if(nums[i]==nums[j]) {
return true;
}
}
}
return false;
}
解法二:
Hashmap
利用hasmap的key不可重复的特点记录数组的元素,value记录数组元素出现的次数,再遍历map,如果有value为2或者以上的直接返回true,否则返回false
public static boolean containsDuplicate2(int[] nums) {
HashMap<Integer,Integer> map= new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++) {
if(!map.containsKey(nums[i])) {
map.put(nums[i],1);
}else {
map.put(nums[i], 1+map.get(nums[i]));
}
}
for(Integer key:map.keySet()) {
if(map.get(key)>=2) return true;
}
return false;
}
缺点效率很低,运行效果:
执行结果:
通过
显示详情
执行用时:11 ms, 在所有 Java 提交中击败了6.10% 的用户
内存消耗:44.8 MB, 在所有 Java 提交中击败了17.10% 的用户
解法三:
排序,在去比较相邻两值是否相等
public static boolean containsDuplicate3(int[] nums) {
Arrays.sort(nums);
for(int i=0;i<nums.length-1;i++) {
if(nums[i]==nums[i+1]) {
return true;
}
}
return false;
}
执行结果:
通过
显示详情
执行用时:3 ms, 在所有 Java 提交中击败了99.70% 的用户
内存消耗:41.3 MB, 在所有 Java 提交中击败了95.99% 的用户
解法四:
set
遍历数组,数字放到 set 中。如果数字已经存在于 set 中,直接返回 true。如果成功遍历完数组,则表示没有重复元素,返回 false。
public static boolean containsDuplicate4(int[] nums) {
HashSet set=new HashSet();
for(Integer i:nums) {
if(set.contains(i)) {
return true;
}
set.add(i);
}
return false;
}
执行结果:
通过
显示详情
执行用时:7 ms, 在所有 Java 提交中击败了36.21% 的用户
内存消耗:42.5 MB, 在所有 Java 提交中击败了50.18% 的用户