题意:给定一个长度为 n的int数组以及一个2D array, 有一个query数组,每个数组里的数[Li, Ri]代表这个区间的子集区间的数都减1,求这个数组在经过这个query数组之后能否变成全部为0的数组
https://leetcode.com/problems/zero-array-transformation-i/description/
题解:用差分数组可以解决,计算经过这么多个query之后如果数组中所有的值都小于等于0,返回true
差分数组:长度和原数组保持一定
example: [8, 2, 3, 5]
查分: [8, -6, 1, 2]
如何还原:[8, 8+(-6), 8+(-6)+1, 8+(-6)+1 + 2]
差分数组求前缀和就是原答案,注意nums[0]特殊对待
class Solution {
public:bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {int n = nums.size();vector<int> sub(n, 0);vector<int> arr(n, 0);for(int i = 0; i < n; i++) {if(!i) {sub[i] = nums[0];} else {sub[i] = nums[i] - nums[i-1];}}for(auto query: queries) {sub[query[0]] -= 1;if(query[1]+1 < n) {sub[query[1] + 1] += 1;}}for(int i = 0; i < n; i++) {if(!i) {arr[i] = sub[0];} else {arr[i] = arr[i-1] + sub[i];}if ( arr[i] > 0 ) {return false;}}return true;}
};