Skip to content

Commit d7d3351

Browse files
committed
Runtime: 47 ms (Top 100.0%) | Memory: 6.62 MB (Top 100.0%)
1 parent c074068 commit d7d3351

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Runtime: 47 ms (Top 100.0%) | Memory: 6.62 MB (Top 100.0%)
2+
3+
impl Solution {
4+
pub fn maximum_white_tiles(mut tiles: Vec<Vec<i32>>, carpet_len: i32) -> i32 {
5+
let n = tiles.len();
6+
tiles.sort_by(|a,b| a[0].cmp(&b[0]));
7+
8+
let mut stack = vec![tiles[0][1] - tiles[0][0] + 1];
9+
for i in 1..n {
10+
stack.push(tiles[i][0] - tiles[i-1][1] - 1);
11+
stack.push(tiles[i][1] - tiles[i][0] + 1);
12+
}
13+
14+
let n = stack.len();
15+
let mut memo = vec![(0,0,false);n+1];
16+
17+
for i in 0..n {
18+
memo[i+1].0 = memo[i].0;
19+
memo[i+1].1 = memo[i].1;
20+
memo[i+1].0 += stack[i];
21+
if i % 2 == 0 {
22+
memo[i+1].1 += stack[i];
23+
memo[i+1].2 = true;
24+
}
25+
}
26+
27+
let mut max = 0;
28+
let mut ri = 0;
29+
for li in 0..n {
30+
while ri < n && memo[ri].0 - memo[li].0 <= carpet_len {
31+
ri += 1;
32+
}
33+
34+
let sum = memo[ri].0 - memo[li].0;
35+
let score = memo[ri].1 - memo[li].1;
36+
if memo[ri].2 {
37+
if sum < carpet_len {
38+
max = std::cmp::max(max, score);
39+
} else {
40+
let over = sum - carpet_len;
41+
let actual_score = score - over;
42+
max = std::cmp::max(max, actual_score);
43+
}
44+
} else {
45+
max = std::cmp::max(max, score);
46+
}
47+
}
48+
49+
max.min(carpet_len)
50+
}
51+
}

0 commit comments

Comments
 (0)