rustgym/leetcode/
_220_contains_duplicate_3.rs1struct 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}