1765. 地图中的最高点
1765. 地图中的最高点
给你一个大小为
m x n
的整数矩阵 isWater
,它代表了一个由 陆地 和 水域 单元格组成的地图。- 如果
isWater[i][j] == 0
,格子(i, j)
是一个 陆地 格子。 - 如果
isWater[i][j] == 1
,格子(i, j)
是一个 水域 格子。
你需要按照如下规则给每个单元格安排高度:
- 每个格子的高度都必须是非负的。
- 如果一个格子是 水域 ,那么它的高度必须为
0
。 - 任意相邻的格子高度差 至多 为
1
。当两个格子在正东、南、西、北方向上相互紧挨着,就称它们为相邻的格子。(也就是说它们有一条公共边)
找到一种安排高度的方案,使得矩阵中的最高高度值 最大 。
请你返回一个大小为 m x n
的整数矩阵 height
,其中 height[i][j]
是格子 (i, j)
的高度。如果有多种解法,请返回 任意一个 。
示例 1:
输入:isWater = [[0,1],[0,0]] 输出:[[1,0],[2,1]] 解释:上图展示了给各个格子安排的高度。 蓝色格子是水域格,绿色格子是陆地格。
示例 2:
输入:isWater = [[0,0,1],[1,0,0],[0,0,0]] 输出:[[1,1,0],[0,1,1],[1,2,2]] 解释:所有安排方案中,最高可行高度为 2 。 任意安排方案中,只要最高高度为 2 且符合上述规则的,都为可行方案。
提示:
m == isWater.length
n == isWater[i].length
1 <= m, n <= 1000
isWater[i][j]
要么是0
,要么是1
。- 至少有 1 个水域格子。
1 #include <iostream> 2 #include <queue> 3 #include <vector> 4 using namespace std; 5 6 constexpr int g_direction[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; 7 class Solution { 8 public: 9 vector<vector<int>> highestPeak(vector<vector<int>>& isWater) { 10 if (isWater.size() <= 0) { 11 return {}; 12 } 13 int m = isWater.size(); 14 int n = isWater[0].size(); 15 vector<vector<int>> ans(m, vector<int>(n, -1)); // 存储水域的高度 16 queue<std::pair<int, int>> q; 17 for (int i = 0; i < m; i++) { 18 for (int j = 0; j < n; j++) { 19 if (isWater[i][j] == 1) { 20 ans[i][j] = 0; // 水域的高度为0 21 q.push(make_pair(i, j)); 22 } 23 } 24 } 25 while (!q.empty()) { 26 std::pair<int, int> now = q.front(); 27 q.pop(); 28 for (int i = 0; i < 4; i++) { 29 int nextX = now.first + g_direction[i][0]; 30 int nextY = now.second + g_direction[i][1]; 31 if ((nextX >= 0 && nextX < m) && (nextY >= 0 && nextY < n) && (ans[nextX][nextY] == -1)) { 32 q.push(make_pair(nextX, nextY)); 33 ans[nextX][nextY] = ans[now.first][now.second] + 1; 34 } 35 } 36 } 37 return ans; 38 } 39 }; 40 41 int main() 42 { 43 Solution *test = new Solution(); 44 // 初始化矩阵 45 vector<vector<int>> isWater = {{0, 0, 1}, {1, 0, 0}, {0, 0, 0}}; 46 vector<vector<int>> answer(isWater); 47 answer = test->highestPeak(isWater); 48 for (int i = 0; i < 3; i++) { 49 for (int j = 0; j < 3; j++) { 50 cout << answer[i][j]<< " "; 51 } 52 cout << endl; 53 } 54 cout << endl; 55 system("pause"); 56 return 0; 57 }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理