File tree 4 files changed +145
-0
lines changed
4 files changed +145
-0
lines changed Original file line number Diff line number Diff line change
1
+ class Solution
2
+ {
3
+ public:
4
+ int oddEvenJumps (vector<int >& A)
5
+ {
6
+ int n = A.size ();
7
+ vector<int > d (n);
8
+ for (int i = 0 ; i < n; i++) d[i] = i;
9
+ stable_sort (d.begin (), d.end (), [&](const int i, const int j){
10
+ return A[i] < A[j];
11
+ });
12
+ vector<int > n1 = st (d);
13
+ stable_sort (d.begin (), d.end (), [&](const int i, const int j){
14
+ return A[i] > A[j];
15
+ });
16
+ vector<int > n2 = st (d);
17
+
18
+ vector<int > h (n), l (n);
19
+ h[n-1 ] = l[n-1 ] = 1 ;
20
+ for (int i = n - 2 ; i >= 0 ; i--)
21
+ {
22
+ h[i] = l[n1[i]];
23
+ l[i] = h[n2[i]];
24
+ }
25
+ return accumulate (h.begin (), h.end (), 0 );
26
+ }
27
+ private:
28
+ vector<int > st (vector<int >& data)
29
+ {
30
+ int n = data.size ();
31
+ vector<int > s, res (n);
32
+ for (int i : data)
33
+ {
34
+ while (!s.empty () and s.back () < i)
35
+ {
36
+ res[s.back ()] = i;
37
+ s.pop_back ();
38
+ }
39
+ s.push_back (i);
40
+ }
41
+ return res;
42
+ }
43
+ };
Original file line number Diff line number Diff line change
1
+ func oddEvenJumps (A []int ) int {
2
+ n := len (A )
3
+ d := make ([]int , n )
4
+ for i := 0 ; i < n ; i ++ {
5
+ d [i ] = i
6
+ }
7
+ sort .SliceStable (d , func (i , j int ) bool {
8
+ return A [d [i ]] < A [d [j ]]
9
+ })
10
+ n1 := st (d )
11
+ sort .SliceStable (d , func (i , j int ) bool {
12
+ return A [d [i ]] > A [d [j ]]
13
+ })
14
+ n2 := st (d )
15
+
16
+ h := make ([]int , n )
17
+ l := make ([]int , n )
18
+ h [n - 1 ], l [n - 1 ] = 1 , 1
19
+ for i := n - 2 ; i >= 0 ; i -- {
20
+ h [i ] = l [n1 [i ]]
21
+ l [i ] = h [n2 [i ]]
22
+ }
23
+ res := 0
24
+ for i := 0 ; i < n ; i ++ {
25
+ if h [i ] > 0 {
26
+ res ++
27
+ }
28
+ }
29
+ return res
30
+ }
31
+
32
+ func st (data []int ) []int {
33
+ n := len (data )
34
+ s := make ([]int , 0 )
35
+ res := make ([]int , n )
36
+ for _ , i := range data {
37
+ for len (s ) > 0 && s [len (s ) - 1 ] < i {
38
+ res [s [len (s ) - 1 ]] = i
39
+ s = s [:len (s ) - 1 ]
40
+ }
41
+ s = append (s , i )
42
+ }
43
+ return res
44
+ }
Original file line number Diff line number Diff line change
1
+ var oddEvenJumps = function ( A ) {
2
+ let n = A . length , d = new Array ( n ) ;
3
+ for ( let i = 0 ; i < n ; i ++ ) d [ i ] = i ;
4
+
5
+ let st = function ( data ) {
6
+ let s = [ ] , res = new Array ( n ) ;
7
+ res . fill ( 0 ) ;
8
+ for ( let i of data ) {
9
+ while ( s . length && s [ s . length - 1 ] < i ) {
10
+ res [ s . pop ( ) ] = i ;
11
+ }
12
+ s . push ( i ) ;
13
+ }
14
+ return res ;
15
+ }
16
+ d . sort ( function ( i , j ) {
17
+ if ( A [ i ] == A [ j ] ) return i - j ;
18
+ else return A [ i ] - A [ j ] ;
19
+ } ) ;
20
+ let n1 = st ( d ) ;
21
+ d . sort ( function ( i , j ) {
22
+ if ( A [ i ] == A [ j ] ) return i - j ;
23
+ else return A [ j ] - A [ i ] ;
24
+ } ) ;
25
+ let n2 = st ( d ) ;
26
+
27
+ let h = new Array ( n ) , l = new Array ( n ) ;
28
+ h . fill ( 0 ) ; l . fill ( 0 ) ;
29
+ h [ n - 1 ] = l [ n - 1 ] = 1 ;
30
+ for ( let i = n - 2 ; i >= 0 ; i -- ) {
31
+ h [ i ] = l [ n1 [ i ] ]
32
+ l [ i ] = h [ n2 [ i ] ]
33
+ }
34
+ let res = 0 ;
35
+ for ( let i of h ) {
36
+ if ( i ) res ++ ;
37
+ }
38
+ return res ;
39
+ } ;
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def oddEvenJumps (self , A : List [int ]) -> int :
3
+ n = len (A )
4
+ def st (data ):
5
+ s , res = [], [0 ]* n
6
+ for i in data :
7
+ while s and s [- 1 ] < i :
8
+ res [s .pop ()] = i
9
+ s .append (i )
10
+ return res
11
+
12
+ d = sorted (range (n ), key = lambda i : A [i ])
13
+ n1 , n2 = st (d ), st (sorted (d , key = lambda i : - A [i ]))
14
+ h , l = [0 ] * n , [0 ] * n
15
+ h [- 1 ] = l [- 1 ] = 1
16
+ for i in range (n - 2 , - 1 , - 1 ):
17
+ h [i ] = l [n1 [i ]]
18
+ l [i ] = h [n2 [i ]]
19
+ return sum (h )
You can’t perform that action at this time.
0 commit comments