|
| 1 | +/** |
| 2 | + * [220] Contains Duplicate III |
| 3 | + * |
| 4 | + * Given an array of integers, find out whether there are two distinct indices i and j in the array such that the absolute difference between nums[i] and nums[j] is at most t and the absolute difference between i and j is at most k. |
| 5 | + * |
| 6 | + * <div> |
| 7 | + * Example 1: |
| 8 | + * |
| 9 | + * |
| 10 | + * Input: nums = <span id="example-input-1-1">[1,2,3,1]</span>, k = <span id="example-input-1-2">3</span>, t = <span id="example-input-1-3">0</span> |
| 11 | + * Output: <span id="example-output-1">true</span> |
| 12 | + * |
| 13 | + * |
| 14 | + * <div> |
| 15 | + * Example 2: |
| 16 | + * |
| 17 | + * |
| 18 | + * Input: nums = <span id="example-input-2-1">[1,0,1,1]</span>, k = <span id="example-input-2-2">1</span>, t = <span id="example-input-2-3">2</span> |
| 19 | + * Output: <span id="example-output-2">true</span> |
| 20 | + * |
| 21 | + * |
| 22 | + * <div> |
| 23 | + * Example 3: |
| 24 | + * |
| 25 | + * |
| 26 | + * Input: nums = <span id="example-input-3-1">[1,5,9,1,5,9]</span>, k = <span id="example-input-3-2">2</span>, t = <span id="example-input-3-3">3</span> |
| 27 | + * Output: <span id="example-output-3">false</span> |
| 28 | + * |
| 29 | + * </div> |
| 30 | + * </div> |
| 31 | + * </div> |
| 32 | + * |
| 33 | + */ |
| 34 | +pub struct Solution {} |
| 35 | + |
| 36 | +// submission codes start here |
| 37 | +use std::collections::HashMap; |
| 38 | +impl Solution { |
| 39 | + pub fn contains_nearby_almost_duplicate(nums: Vec<i32>, k: i32, t: i32) -> bool { |
| 40 | + if k < 1 || t < 0 { return false } |
| 41 | + let mut map = HashMap::new(); |
| 42 | + for i in 0..nums.len() { |
| 43 | + let remap = nums[i] as i64 - i32::min_value() as i64; |
| 44 | + let bucket = remap / (t as i64 + 1); |
| 45 | + println!("{} {}", remap, bucket); |
| 46 | + if map.contains_key(&bucket) |
| 47 | + || map.get(&(bucket-1)).map_or(false, |v| { remap - v <= t as i64}) |
| 48 | + || map.get(&(bucket+1)).map_or(false, |v| { v - remap <= t as i64}) { |
| 49 | + return true |
| 50 | + } |
| 51 | + if i >= k as usize { |
| 52 | + let last_bucket = (nums[i - k as usize] as i64 - i32::min_value() as i64) / (t as i64 + 1); |
| 53 | + map.remove(&last_bucket); |
| 54 | + } |
| 55 | + map.insert(bucket, remap); |
| 56 | + } |
| 57 | + false |
| 58 | + } |
| 59 | +} |
| 60 | + |
| 61 | +// submission codes end |
| 62 | + |
| 63 | +#[cfg(test)] |
| 64 | +mod tests { |
| 65 | + use super::*; |
| 66 | + |
| 67 | + #[test] |
| 68 | + fn test_220() { |
| 69 | + // assert_eq!(Solution::contains_nearby_almost_duplicate(vec![1,5,9,1,5,9], 2, 3), false); |
| 70 | + // assert_eq!(Solution::contains_nearby_almost_duplicate(vec![1,2,3,1], 3, 0), true); |
| 71 | + assert_eq!(Solution::contains_nearby_almost_duplicate(vec![-1,2147483647], 1 ,2147483647), false); |
| 72 | + } |
| 73 | +} |
0 commit comments