力扣:217. 存在重复元素

90 阅读1分钟

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

描述

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

解析

这是一道比较基础的数组的算法题,解题思路主要有两种,分别从时间复杂度和空间复杂度进行取舍。

方式一:

我们可以先将数组进行排序,然后通过对比相邻的两个数据是否相同,进而判断整个数组是否有重复的元素,这样的方式会比较耗时,因为排序的时间复杂度是NlogN,Java解题过程如下:

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

复杂度:

  • 时间复杂度:O(NlogN),n为数组中元素数量,也就是对数组排序所消耗
  • 空间复杂度:O(logN),其中 N 为数组的长度

运行结果:

执行结果:通过

执行用时:20 ms, 在所有 Java 提交中击败了22.30%的用户

内存消耗:55.6 MB, 在所有 Java 提交中击败了5.01%的用户

方式二:

第二种方式则是通过空间换时间的方式,采用哈希表的方式来解决,主要就是通过遍历数组,然后将每一个数据保存到一张哈希表中,在保存之前检测该数据是否已经存在,如果存在,就可以直接返回结果,否则继续进行遍历,直至结束,Java解题过程如下:

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

复杂度:

  • 时间复杂度:O(N),其中 N 为数组的长度
  • 空间复杂度:O(N),其中 N 为数组的长度

运行结果:

执行结果:通过

执行用时:5 ms, 在所有 Java 提交中击败了91.81%的用户

内存消耗:50 MB, 在所有 Java 提交中击败了76.57%的用户