-
-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy path1671-minimum-number-of-removals-to-make-mountain-array.py
53 lines (39 loc) · 1.37 KB
/
1671-minimum-number-of-removals-to-make-mountain-array.py
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
42
43
44
45
46
47
48
49
50
51
52
53
# time complexity: O(nlogn)
# space complexity: O(n)
from typing import List
class Solution:
def getLongestIncreasingSubsequenceLength(self, v: List[int]) -> List[int]:
lisLen = [1] * len(v)
lis = [v[0]]
for i in range(1, len(v)):
index = self.lowerBound(lis, v[i])
if index == len(lis):
lis.append(v[i])
else:
lis[index] = v[i]
lisLen[i] = len(lis)
return lisLen
def lowerBound(self, lis: List[int], target: int) -> int:
left, right = 0, len(lis)
while left < right:
mid = left + (right - left) // 2
if lis[mid] < target:
left = mid + 1
else:
right = mid
return left
def minimumMountainRemovals(self, nums: List[int]) -> int:
N = len(nums)
lisLength = self.getLongestIncreasingSubsequenceLength(nums)
nums.reverse()
ldsLength = self.getLongestIncreasingSubsequenceLength(nums)
ldsLength.reverse()
minRemovals = float("inf")
for i in range(N):
if lisLength[i] > 1 and ldsLength[i] > 1:
minRemovals = min(
minRemovals, N - lisLength[i] - ldsLength[i] + 1
)
return minRemovals
nums = [1, 3, 1]
print(Solution().minimumMountainRemovals(nums))