网易首页 > 网易号 > 正文 申请入驻

2026-09-22:照亮道路的最少灯泡数。用go语言,有一条长度为 n 的道路,位置编号从 0 到 n-1,并用数组 lights 表示初始照明情况。 如果

0
分享至

2026-09-22:照亮道路的最少灯泡数。用go语言,有一条长度为 n 的道路,位置编号从 0 到 n-1,并用数组 lights 表示初始照明情况。

如果 lights[i] 是一个大于 0 的数 v,说明位置 i 上有一盏可用灯,它能照到从 i 向左 v 个位置、向右 v 个位置的范围,也就是 i-v 到 i+v。若这个范围超出道路边界,就只计算道路内的部分。若 lights[i] 等于 0,说明位置 i 没有可用灯。

只要某个位置落在至少一盏可用灯的照明范围内,就认为这个位置已经可见。

你还可以在道路上的任意位置新增灯。每新增一盏灯放在位置 j,它可以照到 j 本身以及左右相邻的位置,也就是 j-1 到 j+1;超出道路边界时同样只保留道路内的部分。

现在要求让 0 到 n-1 的所有位置都可见,问最少需要新增多少盏灯。

1 <= n == lights.length <= 100000。

0 <= lights[i] <= n。

输入: lights = [0,0,0,2,0]。

输出: 1。

解释:

因为 lights[3] = 2,所以位置 3 正常工作的灯泡照亮了位置 [1, 2, 3, 4]。

在位置 1 安装一个额外的灯泡照亮了位置 [0, 1, 2],使每个位置都可见。

因此,所需的最少额外灯泡数量为 1。

题目来自力扣3964。

详细过程如下:

第一步,确定道路长度 n,并准备一个长度为 n+1 的差分数组。这个差分数组不直接记录每个位置被多少灯照亮,而是记录“覆盖数量”的变化量。后续从左到右做前缀和,就能知道每个位置当前被多少盏灯覆盖。

第二步,遍历初始的 lights 数组。对于每个位置 i:
如果 lights[i] 等于 0,说明这个位置没有正常工作的灯,不需要处理。
如果 lights[i] 是一个大于 0 的数 v,说明位置 i 有一盏灯,它能照亮从 i-v 到 i+v 的范围。但道路边界是 0 到 n-1,所以实际照亮范围是:
左边界为 max(0, i-v),
右边界为 min(n-1, i+v)。

在差分数组中,对这个照亮区间整体加 1。具体表现为:在左边界位置加 1,在右边界后面一个位置减 1。因为右边界最大是 n-1,所以右边界后一个位置可能到 n,因此差分数组长度设为 n+1。这样处理完所有初始灯后,差分数组就记录了初始灯在每个位置造成的覆盖变化。

第三步,初始化答案为 0,初始化当前覆盖计数为 0。然后从位置 0 开始,一直到位置 n-1,依次扫描每个位置。

第四步,对于当前扫描到的位置 i,先把差分数组在 i 处的变化量累加到当前覆盖计数中。这个覆盖计数表示位置 i 当前被多少盏灯照亮,包括原本就有的灯和之前新增的灯。

第五步,判断当前位置 i 是否已经被照亮。如果覆盖计数大于 0,说明位置 i 已经可见,不需要新增灯,继续扫描下一个位置。

第六步,如果覆盖计数等于 0,说明位置 i 没有任何灯能照到,必须新增至少一盏灯。为了让新增灯发挥最大作用,贪心地把灯安装在位置 i+1。原因是:一盏新增灯安装在位置 j 时,能照亮 j-1、j、j+1。如果要覆盖当前位置 i,那么新增灯可以放在 i-1、i、i+1 这些位置。其中放在 i+1 是最靠右的选择,它仍然能覆盖 i,同时还能尽量向右覆盖 i+1 和 i+2。这样对后面的位置最有利,因此不会比放在其他位置差。

第七步,新增这盏灯后,答案数量加 1。因为当前位置 i 已经被这盏新增灯覆盖,所以当前覆盖计数也要加 1。同时,这盏新增灯照亮的是 i、i+1、i+2,因此从位置 i+3 开始,它就不再提供照明。于是需要在差分数组中,在 min(i+3, n) 的位置减 1,表示从那里开始覆盖数量减少 1。如果 i+3 已经超过 n-1,就记在 n 处,不影响后续扫描。

第八步,继续向右扫描,重复上述过程,直到所有位置都检查完。最终答案变量中记录的就是最少需要新增的灯泡数量。

以输入 lights = [0,0,0,2,0] 为例:
道路长度 n=5。
位置 3 有一盏灯,值 v=2,所以它照亮 max(0,3-2)=1 到 min(4,3+2)=4,也就是位置 1、2、3、4。
扫描位置 0 时,覆盖计数为 0,说明位置 0 没被照亮。于是新增一盏灯放在位置 1,它照亮位置 0、1、2。答案变为 1。
之后位置 1、2 被新增灯照亮,位置 3、4 被原本位置 3 的灯照亮,所有位置都可见。
因此最少新增灯数为 1。

这个贪心策略的正确性在于:每次遇到一个没被照亮的位置 i,任何合法方案都必须至少新增一盏灯来覆盖它。把灯放在 i+1 既能覆盖 i,又能尽可能向右延伸,不会减少对左侧已经处理过的位置的影响,也不会比放在更左的位置更差。因此这样贪心可以得到最少新增灯数。

时间复杂度:需要遍历一次 lights 数组来构建差分数组,再从左到右扫描一次道路位置,两次都是线性操作,所以总时间复杂度是 O(n)。

额外空间复杂度:主要使用了一个长度为 n+1 的差分数组,因此总额外空间复杂度是 O(n)。

Go完整代码如下:

package main

import (
"fmt"
)

func minLights(lights []int) (ans int) {
n := len(lights)
diff := make([]int, n+1)
for i, v := range lights {
if v > 0 {
// 照亮 [max(i-v, 0), min(i+v, n-1)]
diff[max(i-v, 0)]++
diff[min(i+v+1, n)]--
}
}

sumD := 0
for i, d := range diff[:n] {
sumD += d
if sumD == 0 {
// 在 i+1 装一个灯泡,照亮 [i, i+2]
ans++
sumD++ // diff[i]++ 直接更新到 sumD 中
diff[min(i+3, n)]--
}
}
return
}

func main() {
lights := []int{0, 0, 0, 2, 0}
result := minLights(lights)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-

def minLights(lights):
n = len(lights)
diff = [0] * (n + 1)

# 先处理原本就存在的灯泡照明范围
for i, v in enumerate(lights):
if v > 0:
left = max(i - v, 0)
right = min(i + v + 1, n)
diff[left] += 1
diff[right] -= 1

ans = 0
cover = 0

# 从左到右扫描,若当前位置没有被照亮,则新增一盏灯
for i in range(n):
cover += diff[i]

if cover == 0:
ans += 1
cover += 1
# 新增灯放在 i + 1,可以照亮 i、i + 1、i + 2
# 因此从 i + 3 开始不再受这盏新增灯影响
diff[min(i + 3, n)] -= 1

return ans

if __name__ == "__main__":
lights = [0, 0, 0, 2, 0]
result = minLights(lights)
print(result)

C++完整代码如下:

  




int minLights(const std::vector& lights) {
int n = lights.size();
std::vector diff(n + 1, 0);

// 处理原本就存在的灯泡
for (int i = 0; i < n; ++i) {
int v = lights[i];
if (v > 0) {
int left = std::max(i - v, 0);
int right = std::min(i + v + 1, n);
diff[left]++;
diff[right]--;
}
}

int ans = 0;
int sumD = 0;

// 从左到右扫描,若当前位置没有被照亮,则新增一盏灯
for (int i = 0; i < n; ++i) {
sumD += diff[i];

if (sumD == 0) {
ans++;
sumD++;
// 新增灯放在 i + 1,可以照亮 i、i + 1、i + 2
// 因此从 i + 3 开始不再受这盏新增灯影响
diff[std::min(i + 3, n)]--;
}
}

return ans;
}

int main() {
std::vector lights = {0, 0, 0, 2, 0};
int result = minLights(lights);
std::cout << result << std::endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
华为披露下一代麒麟芯片进展

华为披露下一代麒麟芯片进展

第一财经资讯
2026-10-13 14:21:25
多家俱乐部发出邀约,申花开出高薪+主力承诺!泰山队难留于金永

多家俱乐部发出邀约,申花开出高薪+主力承诺!泰山队难留于金永

中国足球的那些事儿
2026-10-12 22:21:25
真是毁三观!释永信21年前与刘立明在郑州发生关系的笔录曝光

真是毁三观!释永信21年前与刘立明在郑州发生关系的笔录曝光

魔都姐姐杂谈
2025-07-28 14:35:36
王稼祥明明只是政治局候补委员,凭啥会成为遵义会议的关键人物?

王稼祥明明只是政治局候补委员,凭啥会成为遵义会议的关键人物?

展望战史
2026-09-29 06:26:40
紫牛头条|“南拳妈妈”成员称在帕劳潜水时遇袭 同行潜导被扯下面镜呼吸器,多方回应紫牛新闻

紫牛头条|“南拳妈妈”成员称在帕劳潜水时遇袭 同行潜导被扯下面镜呼吸器,多方回应紫牛新闻

扬子晚报
2026-10-12 23:48:21
热议:如何看待近期社保纳入税务处罚?评论区炸锅...

热议:如何看待近期社保纳入税务处罚?评论区炸锅...

慧翔百科
2026-10-13 08:44:25
性价比暴揍亿元先生!曼城8连胜引英媒感叹:其他豪门多照照镜子学一学

性价比暴揍亿元先生!曼城8连胜引英媒感叹:其他豪门多照照镜子学一学

雪狼侃体育
2026-10-13 00:10:24
当年中央拨款5个亿,造了3万多平米的雷神山医院,如今还在用吗?

当年中央拨款5个亿,造了3万多平米的雷神山医院,如今还在用吗?

云居历史
2026-10-09 00:27:32
马斯克最新发声:中国规模化制造威力惊人,DRAM赛道或将复刻光伏、锂电池故事,下一代HBM架构挑战更大

马斯克最新发声:中国规模化制造威力惊人,DRAM赛道或将复刻光伏、锂电池故事,下一代HBM架构挑战更大

投资者内参
2026-10-13 10:06:32
全网热议养老金!大家真正不满的,根本不是涨得少,是太不公平

全网热议养老金!大家真正不满的,根本不是涨得少,是太不公平

你在偷看谁
2026-09-08 20:58:06
养了十年的“儿子”要上市了,估值比“父亲”还贵40%:李彦宏的倒金字塔困局

养了十年的“儿子”要上市了,估值比“父亲”还贵40%:李彦宏的倒金字塔困局

砚舟
2026-10-04 18:28:10
连续4天攻击Yandex数据中心,大量亲俄账号消失 ,特朗普又要急

连续4天攻击Yandex数据中心,大量亲俄账号消失 ,特朗普又要急

鹰眼Defence
2026-10-13 15:34:52
大开眼界!许家印当年奢靡生活曝光

大开眼界!许家印当年奢靡生活曝光

麦杰逊
2026-08-23 15:09:25
缅北蛇蝎美人明珍珍,用老虎笼折磨受害人,她残忍到无法想象

缅北蛇蝎美人明珍珍,用老虎笼折磨受害人,她残忍到无法想象

富强巨靠谱
2025-02-26 09:21:46
事情闹大了!多国联合发表声明了!

事情闹大了!多国联合发表声明了!

故事终将光明磊落
2026-10-12 16:04:23
大涨7%!688808,重回“股王”

大涨7%!688808,重回“股王”

证券时报
2026-10-13 10:58:05
以色列国防军发表声明

以色列国防军发表声明

第一财经资讯
2026-10-13 18:56:20
宏远速递!弗格自宣动身来华,徐杰深夜发声,洛夫顿表态想来广东

宏远速递!弗格自宣动身来华,徐杰深夜发声,洛夫顿表态想来广东

多特体育说
2026-10-13 12:11:58
美媒:中国有超50个能造航母的船坞,超越美国海军只缺一个要素

美媒:中国有超50个能造航母的船坞,超越美国海军只缺一个要素

巅峰高地
2026-10-13 18:46:04
局势彻底恶化了!莫迪贸然开战,印军跨境开火,美国出动F-35A支援,中印边境恐怕要生变?舆论瞬间炸锅!

局势彻底恶化了!莫迪贸然开战,印军跨境开火,美国出动F-35A支援,中印边境恐怕要生变?舆论瞬间炸锅!

谈史论今1
2026-10-10 18:54:23
2026-10-13 20:00:50
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1511文章数 83关注度
往期回顾 全部

科技要闻

扎克伯格宣布追上OpenAI!Meta新模型亮相

头条要闻

河北一公安副局长在办公室里被带走 最新进展来了

头条要闻

河北一公安副局长在办公室里被带走 最新进展来了

体育要闻

走调的歌声里全是感情 最好的郑钦文尚未登场

娱乐要闻

谭松韵亲自解答兰香结局遗憾

财经要闻

"黑医师"产业链调查:不学医竟能"拿证"

汽车要闻

平台可以共享 设计不能趋同:Stellantis的六个新答案

态度原创

旅游
本地
时尚
公开课
军事航空

旅游要闻

安徽长丰:一个千亿县,如何把全县变成文旅体验场

本地新闻

这个十一,林都伊春彻底出圈!

彩毛衣+小黑裤,超显气色的!

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

胡塞武装持续发动袭击 沙特王储被指辗转多个地堡宫殿

无障碍浏览 进入关怀版