2025-05-22 Daily Challenge

Today I have done leetcode's May LeetCoding Challenge with cpp.

May LeetCoding Challenge 22

Description

Zero Array Transformation III

You are given an integer array nums of length n and a 2D array queries where queries[i] = [li, ri].

Each queries[i] represents the following action on nums:

  • Decrement the value at each index in the range [li, ri] in nums by at most 1.
  • The amount by which the value is decremented can be chosen independently for each index.

A Zero Array is an array with all its elements equal to 0.

Return the maximum number of elements that can be removed from queries, such that nums can still be converted to a zero array using the remaining queries. If it is not possible to convert nums to a zero array, return -1.

 

Example 1:

Input: nums = [2,0,2], queries = [[0,2],[0,2],[1,1]]

Output: 1

Explanation:

After removing queries[2], nums can still be converted to a zero array.

  • Using queries[0], decrement nums[0] and nums[2] by 1 and nums[1] by 0.
  • Using queries[1], decrement nums[0] and nums[2] by 1 and nums[1] by 0.

Example 2:

Input: nums = [1,1,1,1], queries = [[1,3],[0,2],[1,3],[1,2]]

Output: 2

Explanation:

We can remove queries[2] and queries[3].

Example 3:

Input: nums = [1,2,3,4], queries = [[0,3]]

Output: -1

Explanation:

nums cannot be converted to a zero array even after using all the queries.

 

Constraints:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 105
  • 1 <= queries.length <= 105
  • queries[i].length == 2
  • 0 <= li <= ri < nums.length

Solution

class Solution {
public:
  int maxRemoval(vector<int>& nums, vector<vector<int>>& queries) {
    sort(queries.begin(), queries.end());
    priority_queue<int> candidates;
    priority_queue<int, vector<int>, greater<int>> chosen;
    int need = 0;
    int pos = 0;
    for(int i = 0; i < nums.size(); ++i) {
      while(pos < queries.size() && queries[pos][0] == i) {
        candidates.push(queries[pos][1]);
        pos += 1;
      }
      nums[i] -= chosen.size();
      while(nums[i] > 0 && candidates.size() && candidates.top() >= i) {
        need += 1;
        chosen.push(candidates.top());
        candidates.pop();
        nums[i] -= 1;
      }
      if(nums[i] > 0) return -1;
      while(chosen.size() && chosen.top() == i) {
        chosen.pop();
      }
    }
    return queries.size() - need;
  }
};

// Accepted
// 824/824 cases passed (131 ms)
// Your runtime beats 51.38 % of cpp submissions
// Your memory usage beats 49.31 % of cpp submissions (224.5 MB)