LeetCode 2237. 计算街道上满足所需亮度的位置数量

2237. 计算街道上满足所需亮度的位置数量

给你一个整数 n。一条完全笔直的街道用一条从 0 到 n - 1 的数轴表示。给你一个二维整数数组 lights,表示街道上的路灯。每个 lights[i] = [positioni, rangei] 表示在位置 positioni 有一盏路灯,从 [max(0, positioni - rangei), min(n - 1, positioni + rangei)] (包含边界) 开始照亮该区域。

位置 p 的 亮度 定义为点亮位置 p 的路灯的数量。给定一个大小为 n 的整数数组 requirement,数组的 下标从 0 开始,其中 requirement[i] 是街道上第 i 个位置的最小 亮度

返回街道上 0 到 n - 1 之间 亮度至少满足 requirement[i] 的位置 i 的数量。

示例 1:

输入: n = 5, lights = [[0,1],[2,1],[3,2]], requirement = [0,2,1,4,1]
输出: 4
解释:
- 第一盏路灯照亮区域范围为 [max(0,0 - 1), min(n - 1,0 + 1)] =[0,1](含边界)。
- 第二盏路灯的点亮范围为 [max(0,2 - 1), min(n - 1,2 + 1)] =[1,3](含边界)。
- 第三盏路灯照亮区域范围为 [max(0,3 - 2), min(n - 1,3 + 2)] =[1,4](含边界)。

- 位置 0 被第一盏路灯覆盖。它被 1 个路灯覆盖,大于 requirement[0]。
- 位置 1 被第一、第二和第三个路灯覆盖。被 3 个路灯覆盖,大于 requirement[1]。
- 位置 2 由第二和第三路灯覆盖。被 2 个路灯覆盖,大于 requirement[2]。
- 位置 3 由第二和第三路灯覆盖。它被 2 个路灯覆盖,比 requirement[3] 少。
- 位置 4 被第三个路灯覆盖。它被 1 盏路灯覆盖,等于 requirement[4]。

位置 0、1、2、4 满足要求,因此返回4。

示例 2:

输入: n = 1, lights = [[0,1]], requirement = [2]
输出: 0
解释:
- 第一盏路灯照亮区域范围为 [max(0,0 - 1), min(n - 1,0 + 1)] =[0,0](含边界)。
- 位置 0 被第一盏路灯覆盖。它被 1 个路灯覆盖,比 requirement[0] 少。
- 返回0,因为没有位置满足亮度要求。

提示:

  • 1 <= n <= 10^5
  • 1 <= lights.length <= 10^5
  • 0 <= positioni < n
  • 0 <= rangei <= 10^5
  • requirement.length == n
  • 0 <= requirement[i] <= 10^5

提示 1

How can we find the brightness at every position on the street?


提示 2

We can use a hash table to store the change in brightness from the previous position to the current position.

解法1:差分数组

Java版:

class Solution {
    public int meetRequirement(int n, int[][] lights, int[] requirement) {
        int[] diff = new int[n + 1];
        for (int[] light: lights) {
            diff[Math.max(0, light[0] - light[1])]++;
            diff[Math.min(n, light[0] + light[1] + 1)]--;
        }

        int ans = diff[0] >= requirement[0] ? 1 : 0;
        for (int i = 1; i < n; i++) {
            diff[i] += diff[i - 1];
            if (diff[i] >= requirement[i]) {
                ans++;
            }
        }
        return ans;
    }
}

Pyhton3版:
 

class Solution:
    def meetRequirement(self, n: int, lights: List[List[int]], requirement: List[int]) -> int:
        diff = [0] * (n + 1)
        for p, r in lights:
            diff[max(0, p - r)] += 1
            diff[min(n, p + r + 1)] -= 1

        ans = 1 if diff[0] >= requirement[0] else 0
        for i in range(1, n):
            diff[i] += diff[i - 1]
            if diff[i] >= requirement[i]:
                ans += 1
        return ans

复杂度分析

  • 时间复杂度:O(M+N),其中 M 是数组 lights 的长度,N 是输入值。

  • 空间复杂度:O(N)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值