一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
题目
存在重复元素
给你一个整数数组 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
题解
解题分析
本题是一个 Leetcode 一个简单级别的题目,主要是考察大家对基础数据结构的掌握。基础数据结无非就是:线性表、栈、队列、串、数组、广义表、树、二叉树、图、排序、查找等内容。下面我们再来看看排序和哈希两种解题的思路。
1. 排序方法
先排序,然后进行遍历数组,如果 nums[i -1 ] == nums[i]
相等,返回 true, 如果都不满足,那么就返回 false.
采用Java 语言答题,我们可以使用系统方法 Arrays.sort
对数组进行排序,底层采用快速排序算法,数组排序的时间复杂度为 O(log(n))
时间复杂度:O(NlogN)
空间复杂度:O(logN)
2. 哈希表方法
创建一个哈希表,然后将数组存入哈希表,判断加入 hash 表是否重复,如果重复返回 true, 如果都不存在返回 false.
时间复杂度:O(N)
空间复杂度:O(N)
解题代码
题解代码如下(代码中有详细的注释说明):
- 排序,解题的代码如下:
class Solution {
public boolean containsDuplicate(int[] nums) {
// 排序,jdk 采用快速排序的方式
Arrays.sort(nums);
for (int i = 1; i < nums.length; i++) {
if (nums[i -1 ] == nums[i]) {
return true;
}
}
return false;
}
}
- 哈希方法,解题的代码如下:
class Solution {
public boolean containsDuplicate(int[] nums) {
HashSet<Integer> set = new HashSet<>(nums.length);
for (int i = 0; i < nums.length; i++) {
if (!set.add(nums[i])) {
return true;
}
}
return false;
}
}
提交后反馈结果(采用排序的方法,由于该题目没有进行优化,性能一般):