IT评测·应用市场-qidao123.com

标题: LeetCode 3356. Zero Array Transformation II (2025/3/13逐日一题) [打印本页]

作者: 宝塔山    时间: 2025-3-14 12:42
标题: LeetCode 3356. Zero Array Transformation II (2025/3/13逐日一题)
标题:zero Array Transformation II
题目:
You are given an integer array nums of length n and a 2D array queries where queries = [li, ri, vali].
Each queries represents the following action on nums:

Zero Array is an array with all its elements equal to 0.
Return the minimum possible non-negative value of k, such that after processing the first k queries in sequence, nums becomes a Zero Array. If no such k exists, return -1.

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

Example 2:
Input: nums = [4,3,2,1], queries = [[1,3,2],[0,2,1]]
Output: -1
Explanation:


题意明白:这道题明白起来稍微有点绕,给定一个一维数组nums, 和一个二维数组queries, queries = [l_i, r_i, val_i] ,在nums数组中l_i到r_i中全部元素最大可以减掉val_i,问最少经过queries中的几步可以将nums变成全零数组。
暴力方法:每经过queries中的一个元素,即将nums中对应的元素减去val_i,,比较到第几步时全变为0。但看到数据量是10的5次方,这种暴力方法肯定不行。因此可以优化为二分查找,每次减到第mid处,判定一次是否为全零,假如是,则往前找,假如不是,再往后找。 判定是否为全零也可以优化,用一个单独的数组array记录元素变化,用类似线扫描的方法扫描queries,到第i个元素时array[queries[0]] += queries[2], array[queries[1] + 1] -= queries[2].
代码如下:
  1. class Solution {
  2. public:
  3.     bool zeroArray(vector<int>& nums, vector<vector<int>>& queries, int idx) {
  4.         int n = nums.size(), sum = 0;
  5.         vector<int> array(n + 1);
  6.         for (int i = 0; i < idx; i++){
  7.             array[queries[i][0]] += queries[i][2];
  8.             array[queries[i][1] + 1] -= queries[i][2];
  9.         }
  10.         for (int i = 0; i < n; i++){
  11.             sum += array[i];
  12.             if (sum < nums[i]) return false;
  13.         }
  14.         return true;
  15.     }
  16.     int minZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
  17.         int n = queries.size(), left = 0, right = queries.size();
  18.         if(!zeroArray(nums, queries, right)) return -1;
  19.         while (left <= right) {
  20.             int mid = left + (right - left) / 2;
  21.             if (canFormZeroArray(nums, queries, mid)) {
  22.                 right = mid - 1;
  23.             } else {
  24.                 left = mid + 1;
  25.             }
  26.         }
  27.         return left;
  28.     }
  29. };
复制代码
时间复杂度O(log(M) * (N+M)),空间复杂度是O(N)

方法二:线扫描 + 线段树方法。(这个算法公主有空研究研究再写,线段树和线扫描都是公主的知识漏洞)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4