問題背景
給定一個長度為 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;}
}