存在重复元素
力扣(LeetCode)
给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
示例 1: 输入: [1,2,3,1] 输出: true
示例 2: 输入: [1,2,3,4] 输出: false
示例 3: 输入: [1,1,1,3,3,4,3,2,4,2] 输出: true
一般解法
class Solution(object):
def containsDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
for i in nums:
for j in nums[nums.index(i)+1:len(nums)]:
if i == j:
return True
return False
if len(set(nums)) != len(nums):
return True
return False
return len(set(nums)) != len(nums)
注意:
- Python中的
True 和False ,首字母大写! - 使用方法一时,注意下标越界、列表切片操作
力扣官方解法
方法一:排序
在对数字从小到大排序之后,数组的重复元素一定出现在相邻位置中。因此,我们可以扫描已排序的数组,每次判断相邻的两个元素是否相等,如果相等则说明存在重复的元素。
class Solution {
public boolean containsDuplicate(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
for (int i = 0; i < n - 1; i++) {
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}
}
复杂度分析
时间复杂度:O(N
l
o
g
N
logN
logN),其中 N 为数组的长度。需要对数组进行排序。Arrays.sort()排序算法的时间复杂度为O(N
l
o
g
N
logN
logN)
TODO 空间复杂度:O(
l
o
g
N
logN
logN),其中 N 为数组的长度。注意我们在这里应当考虑递归调用栈的深度。
java代码转python 注意:当nums中只有一个元素如何处理!
class Solution(object):
def containsDuplicate(self, nums):
nums.sort()
if len(nums) != 0:
for i in range(len(nums)-1):
if nums[i] == nums[i+1]:
return True
return False
return False
方法二:哈希表
对于数组中每个元素,我们将它插入到哈希表中。如果插入一个元素时发现该元素已经存在于哈希表中,则说明存在重复的元素。
class Solution {
public boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for (int x : nums) {
if (!set.add(x)) {
return true;
}
}
return false;
}
}
复杂度分析
时间复杂度:O(N),其中 N 为数组的长度。使用哈希集合(HashSet),添加元素的时间复杂度为 O(1),遍历数组时间复杂度为O(N)
空间复杂度:O(N),其中 N 为数组的长度。算法创建了一个HashSet,占用空间趋向于O(N),其他变量的空间复杂度均为常量
空间复杂度:算法的额外存储空间
相似题
剑指 Offer 03. 数组中重复的数字 题目额外限定了数组元素的大小范围,所以有时间复杂度 O(n)O(n),空间复杂度 O(1)O(1) 的做法。
-
寻找重复数 题目也是额外限定了数组元素的大小范围(注意限定条件和上题不同!),最优做法是快慢指针。关于快慢指针的练习,还可以看这题快乐一下:202. 快乐数,我精心写了题解。 -
删除排序数组中的重复项 做法也是快慢指针。非常经典的题目,C++ 标准库的 unique 方法就是 这么实现的。非常值得一刷。 -
只出现一次的数字 超级经典,我相信绝大多数人已经做过了,没有做过的速速去会会它。姊妹题:137. 只出现一次的数字 II 和 260. 只出现一次的数字 III。这两题也是必刷题,刷了以后会对异或有更深入的了解和认识。其中 剑指 Offer 56 - I. 数组中数字出现的次数 是重复题目,我提供了一种 使用二分解决的思路,值得一看哦~
TODO
2021.7.15
- 不理解力扣官方解法一的空间复杂度为什么是O(
l
o
g
N
logN
logN)?
- 待整理相似题
参考:
- Java Arrays.sort()方法中使用的排序算法
- Java Arrays.sort()方法的时间复杂度分析
- 官方解法
- sweetiee的相似题整理
|