存在重复元素

86 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

一、题目描述

这是 LeetCode 上的一道算法题:存在重复元素,难度为 简单

Tag:「数组」、「哈希表」、「排序」

给你一个整数数组 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

提示:

1 <= nums.length <= 105

-109 <= nums[i] <= 109

二、解题思路

2.1、法一

暴力求解,双重 for 循环

代码:

class Solution {
    //[1,2,3,1]
    public boolean containsDuplicate(int[] nums) {
        if(nums == null)return false;
        int length = nums.length;
        for(int i = 0;i<length;i++){
            for(int j = i+1;j<length;j++){
                if(nums[i] == nums[j]){
                    return true;
                }
            }
        }
        return false;
    }
}

时间复杂度:O(n^2)

2.2、法二

先对数组进行排序,在比较相邻的两个数是否相等,如果相等则证明有相同元素 return true,如果循环结束了没有相同元素则返回 false

代码:

class Solution {
  	//[1,2,3,1]
    public boolean containsDuplicate(int[] nums) {
        if(nums == null)return false;
        Arrays.sort(nums);
        int length = nums.length;
        for(int i = 0;i<length-1;i++){
            if(nums[i] == nums[i+1]){
                return true;
            }
        }
        return false;
    }
}

时间复杂度:O(n)

2.3、法三

for 循环遍历,使用 HashMap 将数组的元素作为 key,索引作为 value 添加,添加之前每次判断 HashMap 是否存在了相同 key,如果存则 return true,结束循环。如果 for 循环结束了也不存在相同的 key,则 return false;

代码:

class Solution {
  	//[1,2,3,1]
    public boolean containsDuplicate(int[] nums) {
        if(nums == null)return false;
        Map<Integer,Integer> integerMap = new HashMap();
        for(int i = 0;i<nums.length;i++){
            if(integerMap.containsKey(nums[i])){
                return true;
            }
            integerMap.put(nums[i],i);
        }
        return false;
    }
}

时间复杂度:O(n)

2.4、法四

for 循环遍历,使用 HashSet 进行重复元素的过滤,如果 HashSet add 时存在相同的元素,其会返回 false

代码:

class Solution {
  	//[1,2,3,1]
    public boolean containsDuplicate(int[] nums) {
        if(nums == null)return false;
        Set<Integer> integerSet = new HashSet();
        int length = nums.length;
        for(int num: nums){
            if(!integerSet.add(num)){
                return true;
            }
        }
        return false;
    }
}

时间复杂度:O(n)

三、总结

本道算法题考查了我们对数组中重复元素的检测,我们使用了 4 中解题方法:

法一:双重 for 循环暴力求解,这种方式是最不可取的,时间复杂度高,效率最低

法二:这种方式调用了 JDK 给我们提供的 Arrays 进行排序,觉得不可取,我们应该自己去编写排序算法实现

法三,法四:一个使用 HashMap,一个使用 HashSet,利用它们不能重复添加元素的特性解决问题,推荐使用

好了,本篇文章到这里就结束了,感谢你的阅读🤝