File tree Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Expand file tree Collapse file tree 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