# 存在重复元素II(219)

# 题目

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。

# 示例

输入: nums = [1,2,3,1], k = 3 输出: true

输入: nums = [1,0,1,1], k = 1 输出: true

输入: nums = [1,2,3,1,2,3], k = 2 输出: false

# 算法

# 滑动窗口

维护一个长度为k的滑动窗口,在里面寻找是否有相同元素

使用双层for循环或者双指针

export const containsNearbyDuplicate = (nums, k) => {
	for (let i = 0; i < nums.length - 1; i++) {
		for (let j = i + 1; j < nums.length && j <= i + k; j++) {
			if (nums[i] === nums[j]) {
				return true;
			}
		}
	}
	return false;
};
1
2
3
4
5
6
7
8
9
10
export const containsNearbyDuplicate = (nums, k) => {
	if (k === 0) return false;
	let l = 0,
		r = 1;
	while (l < nums.length - 1) {
		if (nums[l] === nums[r]) {
			return true;
		}
		if (l + k > r && r < nums.length) { // 当右指针大于数组长度时,应该跳过
			r++;
		} else {
			l++;
			r = l + 1;
		}
	}
	return false;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 哈希表

创建一个长度为k的数组,遍历nums,有相同元素则返回true,否则每推入一个元素则弹出第一个元素

export const containsNearbyDuplicate = (nums, k) => {
	let set = [];
	for (let i = 0; i < nums.length; i++) {
		if (set.indexOf(nums[i]) > -1) {
			return true;
		}
		set.push(nums[i]);
		if (set.length > k) {
			set.shift();
		}
	}
	return false;
};
1
2
3
4
5
6
7
8
9
10
11
12
13

使用set数据结构实现哈希表

export const containsNearbyDuplicate = (nums, k) => {
	const set = new Set();
	for (let i = 0; i < nums.length; i++) {
		if (set.has(nums[i])) {
			return true;
		}
		set.add(nums[i]);
		if (set.length > k) {
			set.delete(nums[i - k]);
		}
	}
};
1
2
3
4
5
6
7
8
9
10
11
12