Description
You are given an integer array nums
. Each element in nums
is 1, 2 or 3. In each operation, you can remove an element fromΒ nums
. Return the minimum number of operations to make nums
non-decreasing.
Β
Example 1:
Input: nums = [2,1,3,2,1]
Output: 3
Explanation:
One of the optimal solutions is to remove nums[0]
, nums[2]
and nums[3]
.
Example 2:
Input: nums = [1,3,2,1,3,3]
Output: 2
Explanation:
One of the optimal solutions is to remove nums[1]
and nums[2]
.
Example 3:
Input: nums = [2,2,2,2,3,3]
Output: 0
Explanation:
nums
is already non-decreasing.
Β
Constraints:
1 <= nums.length <= 100
1 <= nums[i] <= 3
Β
Follow-up: Can you come up with an algorithm that runs inO(n)
time complexity?
Solution
Python3
class Solution:
def minimumOperations(self, nums: List[int]) -> int:
N = len(nums)
@cache
def go(index, MAX):
if index == N: return 0
if nums[index] == MAX:
return go(index + 1, MAX)
else:
ans = inf
for k in range(MAX, 4):
if k == nums[index]:
ans = min(ans, go(index + 1, k))
else:
ans = min(ans, go(index + 1, k) + 1)
return ans
res = inf
for k in range(1, 4):
res = min(res, go(0, k))
return res