-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathmake-array-strictly-increasing.py
More file actions
41 lines (29 loc) · 1.13 KB
/
make-array-strictly-increasing.py
File metadata and controls
41 lines (29 loc) · 1.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import bisect
from typing import List
from functools import lru_cache
class Solution:
def makeArrayIncreasing(self, arr1: List[int], arr2: List[int]) -> int:
array = arr1
replace = list(sorted(set(arr2)))
@lru_cache(None)
def dfs(array_pos: int, prev_number: int) -> int:
min_replacements = len(replace) * 2
if array_pos == len(array):
return 0
next_replace_pos = 0
if array_pos > 0:
next_replace_pos = bisect.bisect(replace, prev_number)
if array_pos == 0 or (next_replace_pos < len(replace)):
tmp = array[array_pos]
min_replacements = min(
min_replacements, dfs(array_pos + 1, replace[next_replace_pos]) + 1
)
if array_pos == 0 or prev_number < array[array_pos]:
min_replacements = min(
min_replacements, dfs(array_pos + 1, array[array_pos])
)
return min_replacements
result = dfs(0, -100)
if result > len(replace):
return -1
return result