news 2026/3/21 11:21:19

leetcode 困难题 827. Making A Large Island 最大人工岛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode 困难题 827. Making A Large Island 最大人工岛

Problem: 827. Making A Large Island 最大人工岛

解题过程

首先统计了所有的1区块,并将坐标放入列表中,对每个区块,拿到距离最近的两个点坐标,若是abs(x-xx) + abs(y-yy)==2,则表示可以connected,将可能的grid[i][j]==0点放入哈希表并累加计数,这种方式比较慢,超时了

最后用了标记的方式,对每个区块标记一个记号,并用哈希表记录这个记号对应的区块大小,对每个grid[i][j]==0,上下左右累加哈希表中记号对应的大小即可,不能重复累加同一个标记区块,拿到最大值即可,计算量大大减小了

Code

class Solution { public: vector<vector<bool>> status; int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}, n; int cnt = 0, cntcnt = 100; unordered_map<int, int> umpump; void dfs(vector<vector<int>>& grid, int x, int y) { status[x][y] = true; int xx, yy; cnt++; for(int i = 0; i < 4; i++) { xx = x + dir[i][0]; yy = y + dir[i][1]; if(xx>=0 && yy>=0 && xx < n && yy < n && grid[xx][yy]==1 && status[xx][yy]==false) { dfs(grid, xx, yy); } } grid[x][y] = cntcnt; } int largestIsland(vector<vector<int>>& grid) { n = grid.size(); status.assign(n, vector<bool>(n, false)); bool zero = false; int mx = INT_MIN; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(grid[i][j] == 1 && status[i][j] == false) { cnt = 0; cntcnt++; dfs(grid, i, j); umpump[cntcnt] = cnt; mx = max(mx, cnt); } if(grid[i][j]==zero) zero = true; } } if(umpump.size()==1) { return mx + (int)zero; } if(umpump.size()==0) { return (int)zero; } int x, y; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(grid[i][j] == 0) { int sum = 1; unordered_set<int> te; for(int k = 0; k < 4; k++) { x = i + dir[k][0]; y = j + dir[k][1]; if(x >= 0 && y >= 0 && x < n && y < n && grid[x][y]!=0) { if(te.find(grid[x][y]) == te.end()) { sum += umpump[grid[x][y]]; } te.insert(grid[x][y]); } } mx = max(mx, sum); } } } return mx; // for(int i = 0; i < tr.size(); i++) { // mx = max(mx, (int)tr[i].size()); // } // unordered_map<int, unordered_set<int>> ump; // int x, y, tx, ty, px, py; // vector<pair<int, int>> p1, p2; // float d1, d2, dis; // for(int i = 0; i < tr.size(); i++) { // p1 = tr[i]; // for(int j = i + 1; j < tr.size(); j++) { // p2 = tr[j]; // for(int k = 0; k < tr[i].size(); k++) { // tx = p1[k].first; // ty = p1[k].second; // for(int w = 0; w < tr[j].size(); w++) { // px = p2[w].first; // py = p2[w].second; // d1 = tx - px; // d2 = ty - py; // dis = abs(d1) + abs(d2); // if(dis == 2.0) { // x = (tx + px) / 2; // y = (ty + py) / 2; // if(tx == px || ty == py) { // ump[(x<<10) + y].insert(i); // ump[(x<<10) + y].insert(j); // } else { // ump[(tx<<10) + py].insert(i); // ump[(tx<<10) + py].insert(j); // ump[(px<<10) + ty].insert(i); // ump[(px<<10) + ty].insert(j); // } // } // } // } // } // } // for(auto [k, l] : ump) { // int sum = 1; // for(auto in : l) { // sum += (int)tr[in].size(); // } // mx = max(sum, mx); // } // return mx; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/19 10:51:48

awk -f后文件名乱码?一键解决问号问题

处理文本数据时&#xff0c;awk命令的“-f”选项用于指定一个包含awk程序代码的脚本文件。然而&#xff0c;用户有时会在使用“awk -f”后遇到文件名显示问号等乱码的情况&#xff0c;这通常不是命令本身的功能&#xff0c;而是由环境或操作问题引发的错误提示。理解其背后的常…

作者头像 李华
网站建设 2026/3/14 12:08:04

OneForAll泛解析检测实战:三步解决子域名收集的核心难题

OneForAll泛解析检测实战&#xff1a;三步解决子域名收集的核心难题 【免费下载链接】OneForAll OneForAll是一款功能强大的子域收集工具 项目地址: https://gitcode.com/gh_mirrors/on/OneForAll 你是否在进行子域名收集时遇到过这样的情况&#xff1a;明明发现了大量子…

作者头像 李华
网站建设 2026/3/21 5:42:16

终极指南:开源AI编程助手OpenCode的完整评测与实战应用

终极指南&#xff1a;开源AI编程助手OpenCode的完整评测与实战应用 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 在当今AI编程工具百花…

作者头像 李华
网站建设 2026/3/17 13:49:12

序列分类模型实战:情感分析/垃圾检测等NLP任务快速上手

序列分类模型实战&#xff1a;情感分析/垃圾检测等NLP任务快速上手 在如今的AI应用开发中&#xff0c;企业越来越依赖自然语言处理技术来理解用户反馈、过滤恶意内容或自动归类海量文本。比如电商平台需要实时判断评论是“好评”还是“差评”&#xff0c;社交平台要识别出垃圾广…

作者头像 李华
网站建设 2026/3/15 8:12:48

XSS过滤规则添加:净化输入内容防注入

XSS过滤规则添加&#xff1a;净化输入内容防注入 在AI模型即服务&#xff08;MaaS&#xff09;平台日益普及的今天&#xff0c;用户通过Web界面或API提交的提示词、配置参数和数据集描述信息&#xff0c;正成为系统安全链条中最脆弱的一环。以ms-swift为例&#xff0c;这个支持…

作者头像 李华