问题背景
给定一个长度为 nnn 的整数数组 numsnumsnums 和一个二维数组 queriesqueriesqueries,其中 queries[i]=[li,ri]queries[i] = [l_i, r_i]queries[i]=[li,ri]。
对于每个查询 queries[i]queries[i]queries[i]:
- 在 numsnumsnums 的下标范围 [li,ri][l_i, r_i][li,ri] 内选择一个下标 子集。
- 将选中的每个下标对应的元素值减 111。
零数组 是指所有元素都等于 000 的数组。
如果在按顺序处理所有查询后,可以将 numsnumsnums 转换为 零数组 ,则返回 truetruetrue,否则返回 falsefalsefalse。
数据约束
- 1≤nums.length≤1051 \le nums.length \le 10 ^ 51≤nums.length≤105
- 0≤nums[i]≤1050 \le nums[i] \le 10 ^ 50≤nums[i]≤105
- 1≤queries.length≤1051 \le queries.length \le 10 ^ 51≤queries.length≤105
- queries[i].length=2queries[i].length = 2queries[i].length=2
- 0≤li≤ri<nums.length0 \le l_i \le r_i < nums.length0≤li≤ri<nums.length
解题过程
由于操作的过程中可以选择子集,所以实际上问题可以转化为能否对范围上的数进行操作,使得所有元素均非正。
而对某个区间上的所有元素进行某种同样的操作,可以用差分来实现。
具体实现
class Solution {
public boolean isZeroArray(int[] nums, int[][] queries) {
int n = nums.length;
int[] diff = new int[n + 1];
for (int[] query : queries) {
diff[query[0]]++;
diff[query[1] + 1]--;
}
int num = 0;
for (int i = 0; i < n; i++) {
num += diff[i];
if (nums[i] > num) {
return false;
}
}
return true;
}
}