题目-217. 存在重复元素给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 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 {
public boolean containsDuplicate(int[] nums) {
if(nums.length==0){
return true;
}
Set<Integer> set=new HashSet<>();
for(int x:nums){
//添加不成功说明x已经存在
if(!set.add(x)){
return true;
}
}
return false;
}
}
时间复杂度O(n)
空间复杂度O(n)
题目-219. 存在重复元素 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
思路
- set维护k大小的元素集合
- 遍历数组,set包含当前遍历元素说明存在不同索引之差小于等于k,因为set的元素个数最大就是k
- 没有包含就加入set
- set的大小超过k就删除首次添加的元素因为将k大小的set加满都没有出现和首次添加重复的元素那么和它重复元素的索引之差肯定超过k(即使存在)
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
//维护k个大小窗口
Set<Integer> set=new HashSet<>();
for(int i=0;i<nums.length;i++){
//set最大就维护k个大小元素,所以一旦出现重复索引之差肯定小于等于k
if(set.contains(nums[i])){
return true;
}
set.add(nums[i]);
//set大小超过k就第一次添加的元素
if(set.size()>k){
set.remove(nums[i-k]);
}
}
return false;
}
}
时间复杂度O(n)
空间复杂度O(min(n,k))