Check if All the Integers in a Range Are Covered

easy array prefix sum difference array

Problem

You are given a list of inclusive intervals ranges, where each [start, end] covers every integer from start to end. Given two integers left and right, return true if every integer in the inclusive range [left, right] is covered by at least one interval, and false otherwise.

Inputranges = [[1,2],[3,4],[5,6]], left = 2, right = 5
Outputtrue
Every value 2, 3, 4, 5 falls inside some interval: 2 in [1,2], 3 and 4 in [3,4], 5 in [5,6].

def is_covered(ranges, left, right):
    diff = [0] * 52
    for s, e in ranges:
        diff[s] += 1
        diff[e + 1] -= 1
    cur = 0
    for i in range(52):
        cur += diff[i]
        if left <= i <= right and cur <= 0:
            return False
    return True
function isCovered(ranges, left, right) {
  const diff = new Array(52).fill(0);
  for (const [s, e] of ranges) {
    diff[s] += 1;
    diff[e + 1] -= 1;
  }
  let cur = 0;
  for (let i = 0; i < 52; i++) {
    cur += diff[i];
    if (i >= left && i <= right && cur <= 0) return false;
  }
  return true;
}
class Solution {
    public boolean isCovered(int[][] ranges, int left, int right) {
        int[] diff = new int[52];
        for (int[] r : ranges) {
            diff[r[0]] += 1;
            diff[r[1] + 1] -= 1;
        }
        int cur = 0;
        for (int i = 0; i < 52; i++) {
            cur += diff[i];
            if (i >= left && i <= right && cur <= 0) return false;
        }
        return true;
    }
}
bool isCovered(vector<vector<int>>& ranges, int left, int right) {
    vector<int> diff(52, 0);
    for (auto& r : ranges) {
        diff[r[0]] += 1;
        diff[r[1] + 1] -= 1;
    }
    int cur = 0;
    for (int i = 0; i < 52; i++) {
        cur += diff[i];
        if (i >= left && i <= right && cur <= 0) return false;
    }
    return true;
}
Time: O(n + R) Space: O(R)