-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmakeArrayStrictlyIncreasing.py
More file actions
38 lines (33 loc) · 1.26 KB
/
makeArrayStrictlyIncreasing.py
File metadata and controls
38 lines (33 loc) · 1.26 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
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Source: https://leetcode.com/problems/make-array-strictly-increasing/
# Author: Miao Zhang
# Date: 2021-04-16
class Solution:
def makeArrayIncreasing(self, arr1: List[int], arr2: List[int]) -> int:
m = len(arr1)
arr2 = sorted(set(arr2))
n = len(arr2)
keep = [float('inf') for _ in range(m)]
keep[0] = 0
swap = [[float('inf') for _ in range(n)] for _ in range(m)]
for j in range(0, n):
swap[0][j] = 1
for i in range(1, m):
minkeep = float('inf')
minswap = float('inf')
for j in range(n):
if j > 0:
minswap = min(minswap, swap[i - 1][j - 1] + 1)
if arr1[i] > arr2[j]:
minkeep = min(minkeep, swap[i - 1][j])
if arr1[i] > arr1[i - 1]:
keep[i] = keep[i - 1]
if arr2[j] > arr1[i - 1]:
swap[i][j] = keep[i - 1] + 1
swap[i][j] = min(swap[i][j], minswap)
keep[i] = min(keep[i], minkeep)
s = min(swap[m - 1])
k = keep[-1]
res = min(s, k)
return -1 if res >= float('inf') else res