
最开始,我直接模拟题目操作,但超时了
于是想到了直接记录[可以操作区间]下标的方式,定义一个等大的数组,只在对应[左右区间下标]位置上+1,这样最终只需要遍历一次数组,即可得到最终数组,然后和原整数数组比对,<则无法变换为0
但写着写着感觉有点无从下手,于是看了题解
思路
差分数组
其实思路和我的一样,但处理方式更好,因为它对于右边界是-1
代码
cpp
class Solution {
public:
bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
// 差分数组,多出来的一个元素用于处理边界
vector<int> deltaArray(nums.size() + 1, 0);
for (int k = 0; k < queries.size(); ++k) {
int i = queries[k][0], j = queries[k][1];
++deltaArray[i];
--deltaArray[j + 1];
}
// 计算前缀和
vector<int> arr;
int sum = 0;
for (auto delta : deltaArray) {
sum += delta;
arr.push_back(sum);
}
for (int i = 0; i < nums.size(); ++i) {
if (arr[i] < nums[i]) {
return false;
}
}
return true;
}
};