Skip to main content

rustgym/leetcode/
_220_contains_duplicate_3.rs

1struct Solution;
2use std::collections::BTreeSet;
3
4impl Solution {
5    fn contains_nearby_almost_duplicate(nums: Vec<i32>, k: i32, t: i32) -> bool {
6        let mut bts = BTreeSet::new();
7        let k = k as usize;
8        let n = nums.len();
9        if t < 0 {
10            return false;
11        }
12        for i in 0..n {
13            let l = nums[i].checked_sub(t).unwrap_or(std::i32::MIN);
14            let r = nums[i].checked_add(t).unwrap_or(std::i32::MAX);
15            if bts.range(l..=r).next().is_none() {
16                bts.insert(nums[i]);
17            } else {
18                return true;
19            }
20            if i >= k {
21                bts.remove(&nums[i - k]);
22            }
23        }
24        false
25    }
26}
27
28#[test]
29fn test() {
30    let nums = vec![1, 2, 3, 1];
31    let k = 3;
32    let t = 0;
33    let res = true;
34    assert_eq!(Solution::contains_nearby_almost_duplicate(nums, k, t), res);
35    let nums = vec![1, 0, 1, 1];
36    let k = 1;
37    let t = 2;
38    let res = true;
39    assert_eq!(Solution::contains_nearby_almost_duplicate(nums, k, t), res);
40    let nums = vec![1, 5, 9, 1, 5, 9];
41    let k = 2;
42    let t = 3;
43    let res = false;
44    assert_eq!(Solution::contains_nearby_almost_duplicate(nums, k, t), res);
45    let nums = vec![-1, -1];
46    let k = 1;
47    let t = -1;
48    let res = false;
49    assert_eq!(Solution::contains_nearby_almost_duplicate(nums, k, t), res);
50    let nums = vec![7, 1, 3];
51    let k = 2;
52    let t = 3;
53    let res = true;
54    assert_eq!(Solution::contains_nearby_almost_duplicate(nums, k, t), res);
55    let nums = vec![0, 2_147_483_647];
56    let k = 1;
57    let t = 2_147_483_647;
58    let res = true;
59    assert_eq!(Solution::contains_nearby_almost_duplicate(nums, k, t), res);
60}