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

2026-08-02:多源图像渲染。用go语言,给定一个大小为 n 行 m 列的网格,开始时只有部分格子有颜色,这些初始有色格子的位置和颜色由数组

0
分享至

2026-08-02:多源图像渲染。用go语言,给定一个大小为 n 行 m 列的网格,开始时只有部分格子有颜色,这些初始有色格子的位置和颜色由数组 sources 给出,每个元素为 [行, 列, 颜色值];其余格子均为无色,记作 0。

在每个单位时间内,所有已经上色的格子会同时尝试把自己的颜色向上下左右四个相邻的格子传播,但只能传播到当前还没有颜色的格子。如果某个无色格子在同一时间步内被多个不同颜色的来源同时扩散到,那么它会接受其中颜色值最大的那个作为自己的颜色。

这一扩散过程不断重复,直到网格中不再有任何无色格子能被上色为止。最终需要返回整个网格的最终颜色状态。

1 <= n, m <= 100000。

1 <= n * m <= 100000。

1 <= sources.length <= n * m。

sources[i] = [ri, ci, colori]。

0 <= ri <= n - 1。

0 <= ci <= m - 1。

1 <= colori <= 1000000。

sources 中的所有 (ri, ci) 互不相同。

输入: n = 3, m = 3, sources = [[0,0,1],[2,2,2]]。

输出: [[1,1,2],[1,2,2],[2,2,2]]。

解释:

每个时间步的网格如下:


在这里插入图片描述

在时间步 2,单元格 (0, 2),(1, 1) 和 (2, 0) 同时被两种颜色到达,因此它们被分配颜色 2,因为它是其中的最大值。

题目来自力扣3905。

详细步骤 第一步:获取输入并初始化结果网格

  • • 给定网格的行数n、列数m以及所有初始着色点sources。

  • • 创建一个n × m的二维整数数组ans,所有元素初始为0,表示未着色。

第二步:对初始源点按颜色值降序排序
  • • 将sources数组按每个元素的第三个值(颜色值)从大到小排序。

  • • 排序后,颜色值大的源点排在前面,这样后续处理时会优先扩展。

第三步:填充初始颜色并构建队列
  • • 遍历排序后的sources,对于每个[r, c, color]:

    • • 将ans[r][c]设为color(即放置初始颜色)。

    • • 同时将该三元组[r, c, color]加入一个队列q中(队列初始就是排序后的sources列表)。

第四步:广度优先扩散(核心循环)
  • • 当队列q不为空时,重复以下操作:

  1. 1. 从队首取出一个元素[x, y, c],它表示坐标(x, y)当前颜色为c,并且该格子已经着色,准备向四周扩散。

  2. 2. 检查四个相邻方向(左、右、上、下),即(x, y-1)、(x, y+1)、(x-1, y)、(x+1, y)。

  3. 3. 对于每个邻居坐标(i, j):

  • • 首先判断(i, j)是否在网格范围内(0 ≤ i < n且0 ≤ j < m)。

  • • 如果该邻居当前在ans中的值为0(表示尚未着色),则:

    • • 将其颜色赋值为当前颜色c,即ans[i][j] = c。

    • • 将新的三元组[i, j, c]追加到队列尾部,以便以后继续从该格子向外扩散。

  • • 如果邻居已经非零(已有颜色),则忽略(不覆盖)。

第五步:循环结束,返回结果
  • • 当队列为空时,说明所有能被着色的格子都已经扩散到,此时ans矩阵即为最终网格状态。

为什么排序 + BFS 能正确模拟“同时到达取最大”
  • • 所有源点都在时刻 0 同时开始扩散,但我们的 BFS 是串行处理的。

  • • 由于先处理高颜色值的源点,当它扩展到某个相邻格子时,会立刻占据它(如果该格尚未被占据)。

  • • 同一时刻,低颜色值的源点也在尝试扩展相同的格子,但因为该格子已经被高颜色占据(非零),低颜色源在后续处理时就会跳过它,从而不会覆盖。

  • • 对于距离较远的格子,高颜色源需要更多步才能到达,而低颜色源如果距离更近,会先到达并占据,高颜色源之后到达时发现非零,也不会覆盖。这恰好符合“先到先得”的原则,而“同时到达”的情况实际上就是处理顺序决定的:同一时间步内先处理高色源,后处理低色源,高色优先占据,因此等效于取最大值。

因此,该算法正确模拟了题目要求的扩散规则。

复杂度分析

  • •时间复杂度

    • • 排序初始源点:O(K log K),其中K = sources.length,且K ≤ n * m。

    • • BFS 遍历每个格子最多一次,因为每个格子一旦着色就不再改变,所以总扩展次数为O(n * m)。

    • • 总体时间复杂度为O(K log K + n * m)。由于K ≤ n * m,最坏情况下可表示为O(N log N),其中N = n * m。

  • •额外空间复杂度

    • • 结果网格ans占用O(n * m)。

    • • 队列q最多存储所有已着色的格子(包括初始源点和扩散过程中新着色的),数量不超过n * m,因此也占用O(n * m)。

    • • 排序使用的额外空间通常为递归栈O(log K)(可忽略)或原地排序无额外大空间。

    • • 因此总额外空间复杂度为O(n * m)。

最终,算法返回的ans矩阵即为题目所求的最终网格着色结果。

Go完整代码如下:

package main

import (
"fmt"
"slices"
)

var dirs = []struct{ x, y int }{{0, -1}, {0, 1}, {-1, 0}, {1, 0}} // 左右上下

func colorGrid(n, m int, sources [][]int) [][]int {
slices.SortFunc(sources, func(a, b []int) int { return b[2] - a[2] })

ans := make([][]int, n)
for i := range ans {
ans[i] = make([]int, m)
}
for _, p := range sources {
ans[p[0]][p[1]] = p[2] // 初始颜色
}

q := sources
for len(q) > 0 {
p := q[0]
q = q[1:]
x, y, c := p[0], p[1], p[2]
for _, d := range dirs { // 向四个方向扩散
i, j := x+d.x, y+d.y
if 0 <= i && i < n && 0 <= j && j < m && ans[i][j] == 0 { // (i, j) 未着色
ans[i][j] = c // 着色
q = append(q, []int{i, j, c}) // 继续扩散
}
}
}

return ans
}
func main() {
n := 3
m := 3
sources := [][]int{{0, 0, 1}, {2, 2, 2}}
result := colorGrid(n, m, sources)
fmt.Println(result)
}

Python完整代码如下:

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

from collections import deque
from typing import List

def colorGrid(n: int, m: int, sources: List[List[int]]) -> List[List[int]]:
# 按颜色从大到小排序(高优先级先扩散)
sources_sorted = sorted(sources, key=lambda x: x[2], reverse=True)
# 初始化网格,全部填 0
ans = [[0] * m for _ in range(n)]
# 放置初始颜色
q = deque()
for r, c, color in sources_sorted:
ans[r][c] = color
q.append((r, c, color)) # 队列中存储坐标和颜色
# 四个方向:左、右、上、下
dirs = [(0, -1), (0, 1), (-1, 0), (1, 0)]
while q:
x, y, col = q.popleft()
for dx, dy in dirs:
i, j = x + dx, y + dy
# 检查边界且未着色
if 0 <= i < n and 0 <= j < m and ans[i][j] == 0:
ans[i][j] = col
q.append((i, j, col))
return ans

# 测试用例
if __name__ == "__main__":
n = 3
m = 3
sources = [[0, 0, 1], [2, 2, 2]]
result = colorGrid(n, m, sources)
for row in result:
print(row)

C++完整代码如下:

  




using namespace std;

// 四个方向:左、右、上、下
const array int , int >, 4 > dirs = {{{ 0 , -1 }, { 0 , 1 }, { -1 , 0 }, { 1 , 0 }}};

vector int >> colorGrid( int n, int m, vector int >>& sources) {
// 按颜色值降序排序(高优先级先处理)
sort(sources.begin(), sources.end(), []( const vector< int >& a, const vector< int >& b) {
return a[ 2 ] > b[ 2 ];
});

// 初始化网格
vector int >> ans(n, vector< int >(m, 0 ));

// 填充初始颜色,同时构建队列(直接使用 sources 作为队列容器)
vector int >> q;
q.reserve(sources.size()); // 预分配空间
for (auto& p : sources) {
int r = p[ 0 ], c = p[ 1 ], color = p[ 2 ];
ans[r][c] = color;
q.push_back({r, c, color});
}

// BFS 扩散(使用 head 指针模拟队列)
size_t head = 0 ;
while (head < q.size()) {
auto& cur = q[head++];
int x = cur[ 0 ], y = cur[ 1 ], col = cur[ 2 ];
for (auto [dx, dy] : dirs) {
int i = x + dx, j = y + dy;
if (i >= 0 && i < n && j >= 0 && j < m && ans[i][j] == 0 ) {
ans[i][j] = col;
q.push_back({i, j, col});
}
}
}

return ans;
}

int main() {
int n = 3 , m = 3 ;
vector int >> sources = {{ 0 , 0 , 1 }, { 2 , 2 , 2 }};
auto result = colorGrid(n, m, sources);

// 输出结果
for ( const auto& row : result) {
for ( int val : row) {
cout << val << " " ;
}
cout << endl;
}
return 0 ;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的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-09-29 07:28:14
太离谱!德国一栋16层住宅楼8个月没有厕所和浴室!居民每天坐电梯下楼洗澡上厕所

太离谱!德国一栋16层住宅楼8个月没有厕所和浴室!居民每天坐电梯下楼洗澡上厕所

英国那些事儿
2026-09-29 00:41:25
山姆回应顾客反映蛋糕内有活虫:产品全程处于0‑4℃,虫卵难以发育

山姆回应顾客反映蛋糕内有活虫:产品全程处于0‑4℃,虫卵难以发育

北青网-北京青年报
2026-09-29 11:03:13
亚洲赌王谢志乐:人称谢三哥,年入700亿美元,澳门赌场一夜输4亿

亚洲赌王谢志乐:人称谢三哥,年入700亿美元,澳门赌场一夜输4亿

疯狂的小历史
2026-09-28 10:42:13
彻底撕开遮羞布!美国公布柬埔寨28人电诈名单,全是高层权贵

彻底撕开遮羞布!美国公布柬埔寨28人电诈名单,全是高层权贵

水泥土的搞笑
2026-09-25 06:54:48
张某杰被骗6960元后自杀身亡,朱某伟被判刑6个月,罚2000元!法院:情节严重

张某杰被骗6960元后自杀身亡,朱某伟被判刑6个月,罚2000元!法院:情节严重

南方都市报
2026-09-30 08:10:11
印度十四亿人正集体失业,恒河变成毒水,这场危机全世界躲不掉?

印度十四亿人正集体失业,恒河变成毒水,这场危机全世界躲不掉?

观史搜寻着
2026-09-29 19:37:48
1943年,13岁的我趴在墙头,看到了日军对三名妇女的禽兽暴行

1943年,13岁的我趴在墙头,看到了日军对三名妇女的禽兽暴行

千秋文化
2026-09-27 21:13:55
亚运会 | “三金王”陈妤颉:极限反超?问题不大

亚运会 | “三金王”陈妤颉:极限反超?问题不大

新京报
2026-09-30 07:26:09
32万所空置小学,正在被酒店疯抢

32万所空置小学,正在被酒店疯抢

钛媒体APP
2026-09-22 11:06:09
中秋晚会主持翻车!全程不看镜头:观众一眼出戏 是提词器装错了?

中秋晚会主持翻车!全程不看镜头:观众一眼出戏 是提词器装错了?

阿废冷眼观察所
2026-09-28 03:53:04
套现146亿后跑路新加坡就能万事大吉?国家新规重拳出击:只要钱还在中国赚,拿了绿卡也照样得补税!申通前老板如意算盘,这下彻底落空了

套现146亿后跑路新加坡就能万事大吉?国家新规重拳出击:只要钱还在中国赚,拿了绿卡也照样得补税!申通前老板如意算盘,这下彻底落空了

人生录
2026-08-16 00:05:13
“我心里不平衡!”75年女子不甘心被认成奶奶,看完孩子被嘲讽的更狠了!

“我心里不平衡!”75年女子不甘心被认成奶奶,看完孩子被嘲讽的更狠了!

林林先生
2026-09-26 09:25:03
昨日11金仍领跑!中国今日冲21金!17岁陈妤颉最后一棒0.09秒险胜

昨日11金仍领跑!中国今日冲21金!17岁陈妤颉最后一棒0.09秒险胜

篮球扫地僧
2026-09-30 07:17:20
热议!女孩从浙江返乡,相亲12次全被拒,只因一句工作经历太心酸

热议!女孩从浙江返乡,相亲12次全被拒,只因一句工作经历太心酸

四海神君
2026-09-27 07:00:08
女孩穿衣就是实在,没有亮点可看着务实!

女孩穿衣就是实在,没有亮点可看着务实!

穿的像个人样
2026-09-30 07:07:56
巴萨赚翻!8000 万新援连场封神,诺坎普捡到绝世神锋

巴萨赚翻!8000 万新援连场封神,诺坎普捡到绝世神锋

澜归序
2026-09-30 08:38:53
斯卡洛尼谈阿根廷10号球衣:在梅西告别前,不会有球员身穿它

斯卡洛尼谈阿根廷10号球衣:在梅西告别前,不会有球员身穿它

懂球帝
2026-09-30 02:07:09
武统可能随时到来?美上将:跟解放军谈不了,8倍核武库随时介入

武统可能随时到来?美上将:跟解放军谈不了,8倍核武库随时介入

探史
2026-09-28 16:17:07
香港歌神的女儿疑似与网球名将分手,互相取消关注,恋情悄然结束

香港歌神的女儿疑似与网球名将分手,互相取消关注,恋情悄然结束

萧狡科普解说
2026-09-30 02:06:24
2026-09-30 09:28:49
moonfdd incentive-icons
moonfdd
福大大架构师每日一题
1486文章数 83关注度
往期回顾 全部

科技要闻

82亿美元收购!李飞飞将与苏姿丰并肩做AI

头条要闻

牛弹琴:全部美军灰溜溜走了 伊拉克举国兴奋放假4天

头条要闻

牛弹琴:全部美军灰溜溜走了 伊拉克举国兴奋放假4天

体育要闻

石雨豪:亚运金牌与背后的十年

娱乐要闻

赌王四房婚礼,何超琼带三房成员现身

财经要闻

中央财政首次贴息房贷 定向支持首套刚需

汽车要闻

搭华为乾崑ADS 5/设计风格换新 2027款纵横G700售30.49万起

态度原创

时尚
亲子
健康
手机
数码

老板,我的脑子好像忘在家里了

亲子要闻

踮着脚,嘴里含着奶嘴,把花瓶好好的抱住。责任心这块,能成大事

洗脸越勤,痘痘反而越多?

手机要闻

涉及约5000人:古尔曼称苹果已搁置AI替代AppleCare客服计划

数码要闻

惠普HyperX格斗游戏键盘Clutch Tachi国行上市,1348.9元

无障碍浏览 进入关怀版