theme: healer-readable
給你一個二維整數數組?ranges?和兩個整數?left?和?right?。每個?ranges[i] = [starti, endi]?表示一個從?starti?到?endi?的?閉區間?。
如果閉區間?[left, right]?內每個整數都被?ranges?中?至少一個?區間覆蓋,那么請你返回?true?,否則返回?false?。
已知區間 ranges[i] = [starti, endi] ,如果整數 x 滿足 starti <= x <= endi?,那么我們稱整數x?被覆蓋了。
示例 1:
輸入:ranges = [[1,2],[3,4],[5,6]], left = 2, right = 5
輸出:true
解釋:2 到 5 的每個整數都被覆蓋了:
- 2 被第一個區間覆蓋。
- 3 和 4 被第二個區間覆蓋。
- 5 被第三個區間覆蓋。
示例 2:
輸入:ranges = [[1,10],[10,20]], left = 21, right = 21
輸出:false
解釋:21 沒有被任何一個區間覆蓋。
解題思路
- 維護一個數組dif,記錄每個區間的起點和終點,dif[i]=n,n為正數代表有n個區間以i為起點,負數則是終點
- 維護一個變量cur,當cur遍歷到i時,cur+=dif[i],代表cur進入了被n個區間覆蓋的區域,如果處于[left,right]之間的節點沒被覆蓋,即cur==0,返回false
代碼
class Solution {public boolean isCovered(int[][] ranges, int left, int right) {int[] dif = new int[52];for (int[] range : ranges) {dif[range[0]]++;dif[range[1]+1]--;}int cur=0;for (int i=0;i<=51;i++){cur+=dif[i];if(i<=right&&i>=left&&cur<=0)return false;}return true;}
}