diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 212ea11..43a5867 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -558,3 +558,5 @@ mod p2643_row_with_maximum_ones; mod p2116_check_if_a_parentheses_string_can_be_valid; mod p2255_count_prefixes_of_a_given_string; + +mod p2711_difference_of_number_of_distinct_values_on_diagonals; diff --git a/src/problem/p2711_difference_of_number_of_distinct_values_on_diagonals.rs b/src/problem/p2711_difference_of_number_of_distinct_values_on_diagonals.rs new file mode 100644 index 0000000..5cc4e9f --- /dev/null +++ b/src/problem/p2711_difference_of_number_of_distinct_values_on_diagonals.rs @@ -0,0 +1,95 @@ +/** + * [2711] Difference of Number of Distinct Values on Diagonals + */ +pub struct Solution {} + +// submission codes start here +use std::collections::HashMap; +use std::collections::HashSet; + +impl Solution { + pub fn difference_of_distinct_values(grid: Vec>) -> Vec> { + let m = grid.len(); + let n = grid[0].len(); + let mut result = vec![vec![0; n]; m]; + + Self::iterate_diagonal(&grid, &mut result, (0..m).rev().map(|i| (i, 0))); + Self::iterate_diagonal(&grid, &mut result, (0..n).rev().map(|i| (0, i))); + + result + } + + fn iterate_diagonal(grid: &Vec>, result: &mut Vec>, iter: T) + where + T: Iterator, + { + let m = grid.len(); + let n = grid[0].len(); + let max_length = m.min(n); + + let mut length = 1; + for (i, j) in iter { + let mut left_set = HashSet::with_capacity(length); + // 右下对角线因为涉及到添加和删除 + // 使用哈希表存储对应数字的出现次数 + let mut right_set = HashMap::with_capacity(length); + + // 首先遍历右下 + let (mut x, mut y) = (i + 1, j + 1); + + for _ in 1..length { + let entry = right_set.entry(grid[x][y]).or_insert(0); + *entry += 1; + + x += 1; + y += 1; + } + + // 然后开始遍历 + let (mut x, mut y) = (i, j); + + for k in 0..length { + // 删除右下对角线 + if k != 0 { + let entry = right_set.get_mut(&grid[x][y]).unwrap(); + *entry -= 1; + if *entry == 0 { + right_set.remove(&grid[x][y]); + } + } + + result[x][y] = left_set.len().abs_diff(right_set.len()) as i32; + + // 插入左上对角线 + left_set.insert(grid[x][y]); + x += 1; + y += 1; + } + + length = max_length.min(length + 1); + } + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_2711() { + assert_eq!( + vec![vec![1, 1, 0], vec![1, 0, 1], vec![0, 1, 1]], + Solution::difference_of_distinct_values(vec![ + vec![1, 2, 3], + vec![3, 1, 5], + vec![3, 2, 1] + ]) + ); + assert_eq!( + vec![vec![0]], + Solution::difference_of_distinct_values(vec![vec![1]]) + ); + } +}