问题背景
给定一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries,其中 q u e r i e s [ i ] = [ l i , r i ] queries[i] = [l_i, r_i] queries[i]=[li,ri]。
对于每个查询 q u e r i e s [ i ] queries[i] queries[i]:
- 在 n u m s nums nums 的下标范围 [ l i , r i ] [l_i, r_i] [li,ri] 内选择一个下标 子集。
- 将选中的每个下标对应的元素值减 1 1 1。
零数组 是指所有元素都等于 0 0 0 的数组。
如果在按顺序处理所有查询后,可以将 n u m s nums nums 转换为 零数组 ,则返回 t r u e true true,否则返回 f a l s e false false。
数据约束
- 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \le nums.length \le 10 ^ 5 1≤nums.length≤105
- 0 ≤ n u m s [ i ] ≤ 1 0 5 0 \le nums[i] \le 10 ^ 5 0≤nums[i]≤105
- 1 ≤ q u e r i e s . l e n g t h ≤ 1 0 5 1 \le queries.length \le 10 ^ 5 1≤queries.length≤105
- q u e r i e s [ i ] . l e n g t h = 2 queries[i].length = 2 queries[i].length=2
- 0 ≤ l i ≤ r i < n u m s . l e n g t h 0 \le l_i \le r_i < nums.length 0≤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;}
}