LC1893.检查是否区域内所有整数都被覆盖

image.png

思路

  • 每个遍历到的区间,区间内部元素全部+ 1(利用差分,可以在O(1)时间内实现)
  • 如果[left, right]区间内依然存在0,说明没有被完全加上,说明没有完全覆盖,否则说明已经完全覆盖。
  • 差分依然要有“公交车上车下车”的实际联想。

    代码

    1. class Solution {
    2. public:
    3. bool isCovered(vector<vector<int>>& ranges, int left, int right) {
    4. // 起始为0
    5. // 遇到一个区间,区间内部所有的数值 + 1
    6. // 最后查区间内部是不是都是0即可
    7. vector<int> full_range(50 + 5, 0);
    8. vector<int> diff(50 + 5, 0);
    9. for (int i = 0, n = ranges.size(); i < n; ++i) {
    10. int begin_pos = ranges[i][0];
    11. int end_pos = ranges[i][1];
    12. diff[begin_pos] += 1;
    13. diff[end_pos + 1] -= 1;
    14. }
    15. for (int i = 0; i < 50 + 5; i++) {
    16. if (i == 0) {
    17. full_range[0] = diff[0];
    18. } else {
    19. full_range[i] = full_range[i - 1] + diff[i];
    20. }
    21. }
    22. for (int i = left; i <= right; i++) {
    23. if (full_range[i] == 0) {
    24. return false;
    25. }
    26. }
    27. return true;
    28. }
    29. };