Welcome to Subscribe On Youtube
3542. Minimum Operations to Convert All Elements to Zero
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 <= 1050 <= nums[i] <= 105
Solutions
Solution 1
-
class Solution { public int minOperations(int[] nums) { Deque<Integer> stk = new ArrayDeque<>(); int ans = 0; for (int x : nums) { while (!stk.isEmpty() && stk.peek() > x) { ans++; stk.pop(); } if (x != 0 && (stk.isEmpty() || stk.peek() != x)) { stk.push(x); } } ans += stk.size(); return ans; } } -
class Solution { public: int minOperations(vector<int>& nums) { vector<int> stk; int ans = 0; for (int x : nums) { while (!stk.empty() && stk.back() > x) { ++ans; stk.pop_back(); } if (x != 0 && (stk.empty() || stk.back() != x)) { stk.push_back(x); } } ans += stk.size(); return ans; } }; -
class Solution: def minOperations(self, nums: List[int]) -> int: stk = [] ans = 0 for x in nums: while stk and stk[-1] > x: ans += 1 stk.pop() if x and (not stk or stk[-1] != x): stk.append(x) ans += len(stk) return ans -
func minOperations(nums []int) int { stk := []int{} ans := 0 for _, x := range nums { for len(stk) > 0 && stk[len(stk)-1] > x { ans++ stk = stk[:len(stk)-1] } if x != 0 && (len(stk) == 0 || stk[len(stk)-1] != x) { stk = append(stk, x) } } ans += len(stk) return ans } -
function minOperations(nums: number[]): number { const stk: number[] = []; let ans = 0; for (const x of nums) { while (stk.length > 0 && stk[stk.length - 1] > x) { ans++; stk.pop(); } if (x !== 0 && (stk.length === 0 || stk[stk.length - 1] !== x)) { stk.push(x); } } ans += stk.length; return ans; } -
impl Solution { pub fn min_operations(nums: Vec<i32>) -> i32 { let mut stk = Vec::new(); let mut ans = 0; for &x in nums.iter() { while let Some(&last) = stk.last() { if last > x { ans += 1; stk.pop(); } else { break; } } if x != 0 && (stk.is_empty() || *stk.last().unwrap() != x) { stk.push(x); } } ans += stk.len() as i32; ans } }