rustgym/leetcode/
_391_perfect_rectangle.rs
1struct Solution;
2
3use std::collections::HashMap;
4
5impl Solution {
6 fn is_rectangle_cover(rectangles: Vec<Vec<i32>>) -> bool {
7 let x1 = rectangles.iter().map(|v| v[0]).min().unwrap();
8 let y1 = rectangles.iter().map(|v| v[1]).min().unwrap();
9 let x2 = rectangles.iter().map(|v| v[2]).max().unwrap();
10 let y2 = rectangles.iter().map(|v| v[3]).max().unwrap();
11 let area = (x2 - x1) * (y2 - y1);
12 let sum: i32 = rectangles
13 .iter()
14 .map(|v| (v[2] - v[0]) * (v[3] - v[1]))
15 .sum();
16 if sum != area {
17 return false;
18 }
19 let mut hm: HashMap<(i32, i32), usize> = HashMap::new();
20 for v in rectangles {
21 *hm.entry((v[0], v[1])).or_default() += 1;
22 *hm.entry((v[2], v[3])).or_default() += 1;
23 *hm.entry((v[0], v[3])).or_default() += 1;
24 *hm.entry((v[2], v[1])).or_default() += 1;
25 }
26 for (k, v) in hm {
27 if k == (x1, y1) || k == (x1, y2) || k == (x2, y1) || k == (x2, y2) {
28 if v != 1 {
29 return false;
30 }
31 } else {
32 if v % 2 != 0 {
33 return false;
34 }
35 }
36 }
37 true
38 }
39}
40
41#[test]
42fn test() {
43 let rectangles = vec_vec_i32![
44 [1, 1, 3, 3],
45 [3, 1, 4, 2],
46 [3, 2, 4, 4],
47 [1, 3, 2, 4],
48 [2, 3, 3, 4]
49 ];
50 let res = true;
51 assert_eq!(Solution::is_rectangle_cover(rectangles), res);
52}