目标
给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] = [li, ri]。
对于每个查询 queries[i]:
- 在 nums 的下标范围 [li, ri] 内选择一个下标 子集。
- 将选中的每个下标对应的元素值减 1。
零数组 是指所有元素都等于 0 的数组。
如果在按顺序处理所有查询后,可以将 nums 转换为 零数组 ,则返回 true,否则返回 false。
示例 1:
输入: nums = [1,0,1], queries = [[0,2]]
输出: true
解释:
对于 i = 0:
选择下标子集 [0, 2] 并将这些下标处的值减 1。
数组将变为 [0, 0, 0],这是一个零数组。
示例 2:
输入: nums = [4,3,2,1], queries = [[1,3],[0,2]]
输出: false
解释:
对于 i = 0:
选择下标子集 [1, 2, 3] 并将这些下标处的值减 1。
数组将变为 [4, 2, 1, 0]。
对于 i = 1:
选择下标子集 [0, 1, 2] 并将这些下标处的值减 1。
数组将变为 [3, 1, 0, 0],这不是一个零数组。
说明:
- 1 <= nums.length <= 10^5
- 0 <= nums[i] <= 10^5
- 1 <= queries.length <= 10^5
- queries[i].length == 2
- 0 <= li <= ri < nums.length
思路
有一个长度为 n
的整数数组,每一次操作可以将给定范围内的任意元素减 1
,判断操作完成后能否将数组中的所有元素变为 0
。
使用差分数组批量修改元素,最后判断是否存在元素大于 0
即可。
代码
/**
* @date 2025-05-20 9:37
*/
public class IsZeroArray3355 {
public boolean isZeroArray(int[] nums, int[][] queries) {
int n = nums.length;
int[] diff = new int[n + 1];
diff[0] = nums[0];
for (int i = 1; i < n; i++) {
diff[i] = nums[i] - nums[i - 1];
}
for (int[] query : queries) {
diff[query[0]] -= 1;
diff[query[1] + 1] += 1;
}
int num = 0;
for (int i = 0; i < n; i++) {
num += diff[i];
if (num > 0) {
return false;
}
}
return true;
}
}