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 <= 105
  • 0 <= 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
        }
    }
    
    

All Problems

All Solutions