Description
You are given an array nums
of size n
, consisting of non-negative integers. Your task is to apply some (possibly zero) operations on the array so that all elements become 0.
In one operation, you can select a subarray [i, j]
(where 0 <= i <= j < n
) and set all occurrences of the minimum non-negative integer in that subarray to 0.
Return the minimum number of operations required to make all elements in the array 0.
Β
Example 1:
Input: nums = [0,2]
Output: 1
Explanation:
- Select the subarray
[1,1]
(which is[2]
), where the minimum non-negative integer is 2. Setting all occurrences of 2 to 0 results in[0,0]
. - Thus, the minimum number of operations required is 1.
Example 2:
Input: nums = [3,1,2,1]
Output: 3
Explanation:
- Select subarray
[1,3]
(which is[1,2,1]
), where the minimum non-negative integer is 1. Setting all occurrences of 1 to 0 results in[3,0,2,0]
. - Select subarray
[2,2]
(which is[2]
), where the minimum non-negative integer is 2. Setting all occurrences of 2 to 0 results in[3,0,0,0]
. - Select subarray
[0,0]
(which is[3]
), where the minimum non-negative integer is 3. Setting all occurrences of 3 to 0 results in[0,0,0,0]
. - Thus, the minimum number of operations required is 3.
Example 3:
Input: nums = [1,2,1,2,1,2]
Output: 4
Explanation:
- Select subarray
[0,5]
(which is[1,2,1,2,1,2]
), where the minimum non-negative integer is 1. Setting all occurrences of 1 to 0 results in[0,2,0,2,0,2]
. - Select subarray
[1,1]
(which is[2]
), where the minimum non-negative integer is 2. Setting all occurrences of 2 to 0 results in[0,0,0,2,0,2]
. - Select subarray
[3,3]
(which is[2]
), where the minimum non-negative integer is 2. Setting all occurrences of 2 to 0 results in[0,0,0,0,0,2]
. - Select subarray
[5,5]
(which is[2]
), where the minimum non-negative integer is 2. Setting all occurrences of 2 to 0 results in[0,0,0,0,0,0]
. - Thus, the minimum number of operations required is 4.
Β
Constraints:
1 <= n == nums.length <= 105
0 <= nums[i] <= 105
Solution
Python3
class Solution:
def minOperations(self, nums: List[int]) -> int:
N = len(nums)
res = 0
mp = defaultdict(list)
stack = []
nextSmaller = [-1] * N
for i, x in enumerate(nums):
mp[x].append(i)
while stack and x < nums[stack[-1]]:
stackTop = stack.pop()
nextSmaller[stackTop] = i
stack.append(i)
A = sorted(mp.items(), key = lambda x : x[0])
for k, v in A:
if k == 0: continue
res += 1
for i in range(len(v) - 1):
curr = nextSmaller[v[i]]
if curr == -1: break
if i + 1 < len(v) and curr < v[i + 1]:
res += 1
return res