Skip to content

Commit ea1ad9f

Browse files
committed
219
1 parent 53e620e commit ea1ad9f

File tree

3 files changed

+109
-1
lines changed

3 files changed

+109
-1
lines changed

SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,4 +198,5 @@
198198
* [216. Combination Sum III](leetcode-216-Combination-SumIII.md)
199199
* [217. Contains Duplicate](leetcode-217-Contains-Duplicate.md)
200200
* [218. The Skyline Problem](leetcode-218-The-Skyline-Problem.md)
201+
* [219. The Skyline Problem](leetcode-219-ContainsDuplicateII.md)
201202
* [更多](more.md)

leetcode-201-300.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@
3434

3535
<a href="leetcode-217-Contains-Duplicate.html">217. Contains Duplicate</a>
3636

37-
<a href="leetcode-218-The-Skyline-Problem.html">218. The Skyline Problem</a>
37+
<a href="leetcode-218-The-Skyline-Problem.html">218. The Skyline Problem</a>
38+
39+
<a href="leetcode-219-ContainsDuplicateII.html">219. The Skyline Problem</a>
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# 题目描述(简单难度)
2+
3+
![](https://windliang.oss-cn-beijing.aliyuncs.com/219.jpg)
4+
5+
判断是否有重复的数字出现,并且两个数字最多相隔 `k`
6+
7+
# 解法一 暴力
8+
9+
两层循环,判断当前数字后的 `k` 个数字是否有重复数字。
10+
11+
```java
12+
public boolean containsNearbyDuplicate(int[] nums, int k) {
13+
int n = nums.length;
14+
for (int i = 0; i < n; i++) {
15+
for (int j = 1; j <= k; j++) {
16+
if (i + j >= n) {
17+
break;
18+
}
19+
if (nums[i] == nums[i + j]) {
20+
return true;
21+
}
22+
}
23+
}
24+
return false;
25+
}
26+
```
27+
28+
# 解法二 map
29+
30+
利用 `hashmap``key` 存储值,`value` 存储下标。遍历数组,如果出现重复的值,判断下标的关系。
31+
32+
```java
33+
public boolean containsNearbyDuplicate(int[] nums, int k) {
34+
HashMap<Integer, Integer> map = new HashMap<>();
35+
int n = nums.length;
36+
for (int i = 0; i < n; i++) {
37+
if (map.containsKey(nums[i])) {
38+
int index = map.get(nums[i]);
39+
if (i - index <= k) {
40+
return true;
41+
}
42+
}
43+
//更新当前值的下标
44+
map.put(nums[i], i);
45+
}
46+
return false;
47+
}
48+
```
49+
50+
# 解法三 set
51+
52+
没想到用 `set` 也能做,参考 [这里](https://leetcode.com/problems/contains-duplicate-ii/discuss/61372/Simple-Java-solution)
53+
54+
因为下标相差不能超过 `k`,所以我们 `set` 中只存储 `k+1` 个连续的数,超过以后就将 `set` 中的第一个数删除。
55+
56+
```java
57+
public boolean containsNearbyDuplicate(int[] nums, int k) {
58+
HashSet<Integer> set = new HashSet<>();
59+
int n = nums.length;
60+
int i = 0;
61+
//将 k + 1 个数存入 set
62+
for (; i <= k && i < n; i++) {
63+
if (set.contains(nums[i])) {
64+
return true;
65+
}
66+
set.add(nums[i]);
67+
}
68+
for (; i < n; i++) {
69+
//移除 set 中第一个数
70+
set.remove(nums[i - k - 1]);
71+
//判断 set 中是否有当前数
72+
if (set.contains(nums[i])) {
73+
return true;
74+
}
75+
//将当前数加入
76+
set.add(nums[i]);
77+
}
78+
return false;
79+
}
80+
```
81+
82+
当然上边的代码,可以利用 `set.add` 的返回值来简化代码。
83+
84+
如果要加入的数在 `set` 中已经存在,那么 `add` 就会返回 `false`。我们就不需要调用 `set.contains` 了。
85+
86+
```java
87+
public boolean containsNearbyDuplicate(int[] nums, int k) {
88+
HashSet<Integer> set = new HashSet<>();
89+
int n = nums.length;
90+
for (int i = 0; i < n; i++) {
91+
if (i > k) {
92+
set.remove(nums[i - k - 1]);
93+
}
94+
if (!set.add(nums[i])) {
95+
return true;
96+
}
97+
}
98+
return false;
99+
}
100+
```
101+
102+
#
103+
104+
前两种解法都比较容易想到,解法三通过一个滑动窗口解决问题,很巧妙。
105+

0 commit comments

Comments
 (0)