@@ -29,7 +29,7 @@ impl Solution {
29
29
30
30
/// segment tree with range modification but no query
31
31
impl Solution {
32
- pub fn min_interval ( mut intervals : Vec < Vec < i32 > > , queries : Vec < i32 > ) -> Vec < i32 > {
32
+ pub fn min_interval ( intervals : Vec < Vec < i32 > > , queries : Vec < i32 > ) -> Vec < i32 > {
33
33
use std:: { i32, usize} ;
34
34
let mut sorted = vec ! [ ] ;
35
35
for itv in intervals. iter ( ) {
@@ -39,17 +39,16 @@ impl Solution {
39
39
sorted. sort_unstable ( ) ;
40
40
sorted. dedup ( ) ;
41
41
let n = sorted. len ( ) ;
42
- // partition_point is unstable
42
+ // partition_point is stable since 1.52.0
43
43
let deflate = |key| -> usize { sorted. binary_search ( & key) . unwrap_or_else ( |i| i) } ;
44
44
45
45
let mut seg = vec ! [ i32 :: MAX ; 2 * n] ;
46
- intervals. sort_unstable_by_key ( |itv| itv[ 1 ] -itv[ 0 ] ) ;
47
46
for itv in intervals. iter ( ) {
48
47
let mut l = deflate ( itv[ 0 ] ) + n-1 ;
49
48
let mut r = deflate ( itv[ 1 ] +1 ) + n;
50
49
while ( l ^ r) != 1 {
51
- if l%2 == 0 && seg[ l^1 ] == i32 :: MAX { seg[ l^1 ] = itv[ 1 ] -itv[ 0 ] +1 ; }
52
- if r%2 != 0 && seg[ r^1 ] == i32 :: MAX { seg[ r^1 ] = itv[ 1 ] -itv[ 0 ] +1 ; }
50
+ if l%2 == 0 { seg[ l^1 ] = seg[ l^1 ] . min ( itv[ 1 ] -itv[ 0 ] +1 ) ; }
51
+ if r%2 != 0 { seg[ r^1 ] = seg[ r^1 ] . min ( itv[ 1 ] -itv[ 0 ] +1 ) ; }
53
52
l /= 2 ;
54
53
r /= 2 ;
55
54
}
@@ -58,12 +57,10 @@ impl Solution {
58
57
seg[ i] = seg[ i] . min ( seg[ i/2 ] ) ;
59
58
}
60
59
61
- let mut ans = vec ! [ ] ;
62
- for q in queries {
60
+ queries. into_iter ( ) . map ( |q| {
63
61
let i = deflate ( q+1 ) -1 ;
64
- ans. push ( if i == usize:: MAX || seg[ n+i] == i32:: MAX { -1 } else { seg[ n+i] } ) ;
65
- }
66
- ans
62
+ if i == usize:: MAX || seg[ n+i] == i32:: MAX { -1 } else { seg[ n+i] }
63
+ } ) . collect ( )
67
64
}
68
65
}
69
66
@@ -79,7 +76,7 @@ impl Solution {
79
76
sorted. sort_unstable ( ) ;
80
77
sorted. dedup ( ) ;
81
78
let n = sorted. len ( ) ;
82
- // partition_point is unstable
79
+ // partition_point is stable since 1.52.0
83
80
let deflate = |key| -> usize { sorted. binary_search ( & key) . unwrap_or_else ( |i| i) } ;
84
81
85
82
let mut uf: Vec < usize > = ( 0 ..n) . collect ( ) ;
@@ -103,11 +100,9 @@ impl Solution {
103
100
}
104
101
}
105
102
106
- let mut ans = vec ! [ ] ;
107
- for q in queries {
103
+ queries. into_iter ( ) . map ( |q| {
108
104
let i = deflate ( q+1 ) -1 ;
109
- ans. push ( if i == usize:: MAX { -1 } else { len[ i] } ) ;
110
- }
111
- ans
105
+ if i == usize:: MAX { -1 } else { len[ i] }
106
+ } ) . collect ( )
112
107
}
113
108
}
0 commit comments