每日一题:存在重复元素

地址

难度

简单

题目

给你一个整数数组 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 <= 10^5
  • -10^9 <= nums[i] <= 10^9

思路

  • 暴力破解

双重 for 循环。判断是否存在相同的值,存在则返回 true,否则返回 false。

时间复杂度 O(n^2),空间复杂度 O(1)。不过在 Leetcode 上执行的时候。提示超时时间限制

class Solution {
    public boolean containsDuplicate(int[] nums) {
        for(int i = 0;i< nums.length-1;i++){
            for(int j = i+1;j< nums.length;j++){
                if(nums[i] == nums[j]){
                    return true;
                }
            }
        }
        return false;
    }
}
  • 排序

题目要求是判断存在重复的元素,那么将数组从小到大进行排序。然后再一次 for 循环,判断相邻的两个数是否有相同的。

其时间复杂度为O(n*log(n)),空间复杂度为 O(1)

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Arrays.sort(nums);
        for (int i =0;i<nums.length-1;i++){
            if(nums[i] == nums[i+1]){
                return true;
            }
        }
        return false;
    }
}
  • 计数法

利用 HashMap,其中 key 为数值,value 为出现次数。遍历整个数组,对记录每个数值出现的次数()。接着遍历 HashMap 中的每个 Entry,寻找 value 值大于 1 的 。

其时间复杂度为 O(n),空间复杂度为 O(n)

class Solution {
    public boolean containsDuplicate(int[] nums) {
        HashMap<Integer,Integer> map =new HashMap<>();
        for(int x:nums){
            map.put(x,map.getOrDefault(x,0)+1);
        }
        for (int x : map.values()){
            if(x >1){
                return true;
            }
        }
        return false;
    }
  • 使用 set

遍历数组,数字放到 set 中。如果数字已经存在于 set 中,直接返回 true。如果成功遍历完数组,则表示没有重复元素,返回 false。

其时间复杂度为 O(n),空间复杂度为 O(n)

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int num: nums) {
            if (set.contains(num)) {
                return true;
            }
            set.add(num);
        }
        return false;
    }
}