1
+ // Runtime: 3 ms (Top 75.0%) | Memory: 2.25 MB (Top 75.0%)
2
+
3
+ pub fn normalize (
4
+ mut vec : [ Vec < u8 > ; 3 ] ,
5
+ diff : u8 ,
6
+ ) -> Option < [ Vec < u8 > ; 3 ] > {
7
+ if diff < 1 { return Some ( vec) ; }
8
+
9
+ if vec[ 1 ] . is_empty ( ) && vec[ 2 ] . is_empty ( ) {
10
+ return None ;
11
+ }
12
+
13
+ if vec[ 1 ] . is_empty ( ) {
14
+ vec[ 2 ] . pop ( ) ;
15
+ return normalize ( vec, ( diff + 1 ) % 3 ) ;
16
+ }
17
+
18
+ if vec[ 2 ] . is_empty ( ) {
19
+ vec[ 1 ] . pop ( ) ;
20
+ return normalize ( vec, ( diff + 2 ) % 3 ) ;
21
+ }
22
+
23
+ // both non-empty
24
+ vec[ diff as usize ] . pop ( ) ;
25
+ Some ( vec)
26
+ }
27
+
28
+ impl Solution {
29
+ fn preproc ( mut vec : Vec < i32 > ) -> ( [ Vec < u8 > ; 3 ] , u8 ) {
30
+ vec. sort_unstable ( ) ;
31
+ vec. reverse ( ) ;
32
+ let diff = vec. iter ( ) . sum :: < i32 > ( ) as u32 ;
33
+ let diff = ( diff % 3 ) as u8 ;
34
+
35
+ let mut ret = [ vec ! [ ] , vec ! [ ] , vec ! [ ] ] ;
36
+
37
+ for e in vec {
38
+ ret[ e as usize % 3 ] . push ( e as u8 ) ;
39
+ }
40
+
41
+ ( ret, diff)
42
+ }
43
+
44
+ fn _impl ( vec : Vec < i32 > ) -> Option < Vec < u8 > > {
45
+ let ( vec, diff) = Self :: preproc ( vec) ;
46
+ let [ mut vec_0, mut vec_1, mut vec_2] = normalize ( vec, diff) ?;
47
+
48
+ vec_0. append ( & mut vec_1) ;
49
+ vec_0. append ( & mut vec_2) ;
50
+ vec_0. sort_unstable ( ) ;
51
+ vec_0. reverse ( ) ;
52
+
53
+ if vec_0. is_empty ( ) { return None ; }
54
+ if vec_0[ 0 ] < 1 { return Some ( vec ! [ 0 ] ) ; }
55
+
56
+ Some ( vec_0)
57
+ }
58
+
59
+ pub fn largest_multiple_of_three ( vec : Vec < i32 > ) -> String {
60
+ let ret = if let Some ( inner) = Self :: _impl ( vec) {
61
+ inner
62
+ } else { return String :: new ( ) ; } ;
63
+
64
+ ret. into_iter ( )
65
+ . map ( |e| ( e + '0' as u8 ) as char )
66
+ . collect ( )
67
+ }
68
+ }
0 commit comments