开启掘金成长之旅!这是我参与「掘金日新计划 · 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%的用户