Skip to content

Commit 7f347ba

Browse files
committed
Contains duplicate II
1 parent b571dbc commit 7f347ba

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// 219. Contains duplicate II
2+
// Topics: 'Array', 'Hash Table', 'Sliding Window'
3+
4+
// Given an integer array nums and an integer k, return true if there are two distinct indices i and j in the array such that nums[i] == nums[j] and abs(i - j) <= k.
5+
6+
// Example 1:
7+
8+
// Input: nums = [1,2,3,1], k = 3
9+
// Output: true
10+
11+
// Example 2:
12+
13+
// Input: nums = [1,0,1,1], k = 1
14+
// Output: true
15+
16+
// Example 3:
17+
18+
// Input: nums = [1,2,3,1,2,3], k = 2
19+
// Output: false
20+
21+
// Constraints:
22+
23+
// 1 <= nums.length <= 105
24+
// -109 <= nums[i] <= 109
25+
// 0 <= k <= 105
26+
27+
package containsdiplicateii
28+
29+
func containsNearbyDuplicate(nums []int, k int) bool {
30+
m := map[int]struct{}{}
31+
L := 0
32+
for R := range len(nums) {
33+
if R-L > k {
34+
delete(m, nums[L])
35+
L += 1
36+
}
37+
if _, ok := m[nums[R]]; ok {
38+
return true
39+
}
40+
m[nums[R]] = struct{}{}
41+
}
42+
return false
43+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package containsdiplicateii
2+
3+
import "testing"
4+
5+
func TestContainsNearbyDuplicate(t *testing.T) {
6+
tests := []struct {
7+
name string
8+
nums []int
9+
k int
10+
want bool
11+
}{
12+
{
13+
name: "Example 1",
14+
nums: []int{1, 2, 3, 1},
15+
k: 3,
16+
want: true,
17+
},
18+
{
19+
name: "Example 2",
20+
nums: []int{1, 0, 1, 1},
21+
k: 1,
22+
want: true,
23+
},
24+
{
25+
name: "Example 3",
26+
nums: []int{1, 2, 3, 1, 2, 3},
27+
k: 2,
28+
want: false,
29+
},
30+
{
31+
name: "No duplicates",
32+
nums: []int{1, 2, 3, 4, 5},
33+
k: 3,
34+
want: false,
35+
},
36+
{
37+
name: "Duplicate but too far apart",
38+
nums: []int{1, 2, 1},
39+
k: 1,
40+
want: false,
41+
},
42+
{
43+
name: "Single element",
44+
nums: []int{99},
45+
k: 10,
46+
want: false,
47+
},
48+
{
49+
name: "k is zero",
50+
nums: []int{1, 1},
51+
k: 0,
52+
want: false,
53+
},
54+
{
55+
name: "Large k covers whole array",
56+
nums: []int{5, 6, 7, 5},
57+
k: 10,
58+
want: true,
59+
},
60+
}
61+
62+
for _, tt := range tests {
63+
t.Run(tt.name, func(t *testing.T) {
64+
got := containsNearbyDuplicate(tt.nums, tt.k)
65+
if got != tt.want {
66+
t.Errorf("containsNearbyDuplicate(%v, %d) = %v; want %v",
67+
tt.nums, tt.k, got, tt.want)
68+
}
69+
})
70+
}
71+
}

0 commit comments

Comments
 (0)