3355. 零数组变换 I
问题描述
给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] = [li, ri]。
对于每个查询 queries[i]:
在 nums 的下标范围 [li, ri] 内选择一个下标 子集。
将选中的每个下标对应的元素值减 1。
零数组 是指所有元素都等于 0 的数组。
如果在按顺序处理所有查询后,可以将 nums 转换为 零数组 ,则返回 true,否则返回 false。
分析
可以每次将每个元素都-1,最后判断是否存在大于0的元素。暴力会卡时间,这个题用差分数组。
差分数组的第0项通常是原数组第0项。
差分后再求前缀和 <=> 求前缀和后再求差分 <=> 原数组
法一、暴力,会卡时间,测试案例664/668
class Solution {
public:
bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
int q_n = queries.size();
for (int i = 0; i < q_n; i++) {
vector<int> q_x = queries[i];
int start = q_x[0], end = q_x[1];
for (int j = start; j <= end; j++) {
if (nums[j] == 0) {
continue;
}
nums[j]--;
}
}
int n_n = nums.size();
for (int i = 0; i < n_n; i++) {
if (nums[i] != 0) {
return false;
}
}
return true;
}
};
法二、差分
class Solution {
public:
bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
int n = nums.size();
vector<int> diff(n+1, 0);
diff[0] = nums[0];
for (int i = 1; i < n; i++) {
diff[i] = nums[i] - nums[i-1];
}
int q_n = queries.size();
for (int i = 0; i < q_n; i++) {
int l = queries[i][0], r = queries[i][1];
diff[l]--; diff[r+1]++;
}
vector<int> last(n, 0);
last[0] = diff[0];
for (int i = 1; i < n; i++) {
last[i] = diff[i] + last[i-1];
}
for (int i = 0; i < n; i++) {
if (last[i] > 0) {
return false;
}
}
return true;
}
};

浙公网安备 33010602011771号