leetcode_rust/
contains_duplicate_2.rs

1#![allow(dead_code)]
2
3pub fn contains_nearby_duplicate(nums: Vec<i32>, k: i32) -> bool {
4    use std::collections::HashMap;
5
6    let mut map: HashMap<i32, usize> = HashMap::new();
7    for num in nums.into_iter().enumerate() {
8        match map.get_mut(&num.1) {
9            Some(v) => {
10                if num.0 - *v <= k as usize {
11                    return true;
12                } else {
13                    *v = num.0;
14                }
15            }
16
17            None => {
18                map.insert(num.1, num.0);
19            }
20        }
21    }
22
23    false
24}
25
26pub fn contains_nearby_duplicate2(nums: Vec<i32>, k: i32) -> bool {
27    use std::collections::HashSet;
28
29    // use slides to record k numbers.
30    let mut set = HashSet::new();
31    let k = k as usize;
32    for (i, num) in nums.clone().into_iter().enumerate() {
33        if set.contains(&num) {
34            return true;
35        } else {
36            set.insert(num);
37            if set.len() > k {
38                let temp = nums[i - k];
39                set.remove(&temp);
40            }
41        }
42    }
43
44    false
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn test1() {
53        assert_eq!(contains_nearby_duplicate(vec![1, 2, 3, 1, 2, 3], 2), false);
54        assert_eq!(contains_nearby_duplicate(vec![1, 0, 1, 1], 1), true);
55    }
56
57    #[test]
58    fn test2() {
59        assert_eq!(contains_nearby_duplicate2(vec![1, 2, 3, 1, 2, 3], 2), false);
60        assert_eq!(contains_nearby_duplicate2(vec![1, 0, 1, 1], 1), true);
61    }
62}