File tree 1 file changed +51
-0
lines changed
scripts/algorithms/M/Maximum White Tiles Covered by a Carpet
1 file changed +51
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments