File tree 1 file changed +60
-0
lines changed
1 file changed +60
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number[] } arr1
3
+ * @param {number[] } arr2
4
+ * @return {number }
5
+ */
6
+ const makeArrayIncreasing = function ( arr1 , arr2 ) {
7
+ arr2 . sort ( ( a , b ) => a - b )
8
+ let arr3 = [ arr2 [ 0 ] ]
9
+ for ( let i = 1 ; i < arr2 . length ; i ++ ) {
10
+ if ( arr2 [ i ] > arr2 [ i - 1 ] ) {
11
+ arr3 . push ( arr2 [ i ] )
12
+ }
13
+ }
14
+ arr2 = arr3
15
+ let n = arr1 . length
16
+ let indexMap = new Array ( n * 2 + 2 )
17
+ for ( let i = 0 ; i < n ; i ++ ) {
18
+ let ai = arr1 [ i ]
19
+ let li = findLarger ( arr2 , ai )
20
+ indexMap [ i * 2 ] = li
21
+ indexMap [ i * 2 + 1 ] = arr2 [ li - 1 ] === ai ? li - 2 : li - 1
22
+ }
23
+ indexMap [ n * 2 ] = arr2 . length
24
+ indexMap [ n * 2 + 1 ] = arr2 . length - 1
25
+ let dp = new Array ( n + 1 )
26
+ let MaxNum = 1000000000 + 1
27
+ dp [ 0 ] = 0
28
+ for ( let i = 1 ; i < n + 1 ; i ++ ) {
29
+ let min = i
30
+ let ai = i === n ? MaxNum : arr1 [ i ]
31
+ for ( let j = 0 ; j < i ; j ++ ) {
32
+ if ( dp [ j ] == - 1 || ai <= arr1 [ j ] ) {
33
+ continue
34
+ }
35
+ if ( indexMap [ i * 2 + 1 ] - indexMap [ j * 2 ] + 1 < i - j - 1 ) continue
36
+ min = Math . min ( min , dp [ j ] + i - j - 1 )
37
+ }
38
+ if ( min === i ) {
39
+ if ( indexMap [ i * 2 + 1 ] + 1 < i ) {
40
+ min = - 1
41
+ }
42
+ }
43
+ dp [ i ] = min
44
+ }
45
+ return dp [ n ]
46
+ }
47
+ const findLarger = function ( arr , a ) {
48
+ if ( a > arr [ arr . length - 1 ] ) return arr . length
49
+ let l = 0
50
+ let r = arr . length - 1
51
+ while ( l < r ) {
52
+ let mid = ( l + r ) >> 1
53
+ if ( arr [ mid ] <= a ) {
54
+ l = mid + 1
55
+ } else {
56
+ r = mid
57
+ }
58
+ }
59
+ return l
60
+ }
You can’t perform that action at this time.
0 commit comments