难度中等63收藏分享切换为英文接收动态反馈
给你一个大小为 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
,可以看示例2,(3,2)位置是2,从(3,2)位置到(3,3)位置,本可以使得(3,3)位置的高度为(3,2)位置的高度+1得到3,但是由于(2, 3)也可以到达(3,3),而(2,3)位置的高度是1,限制了(3,3)位置的高度不能超过2。
第二点,我们希望最高的高度最大,那么自然就会想到尽可能让每一步都会提升1的高度。而每个格子的最大高度,显然就是所有可以到达它的路径上的最小的那个高度决定。由于本题的移动规则仅限于相邻的格子,即每一步的代价都相同,因此很容易想到这是一个BFS问题,同时BFS也的确可以保证最快到达某一个点,即到达这个点的时候,高度就是那个所有待选高度集合中的最小值。
class Solution {
public:
int dir[4][2] = {
{0, 1},
{0, -1},
{1, 0},
{-1, 0},
};
struct coord{
int x, y, height;
};
void BFS(vector<vector<int>>& final_map, bool visited[1005][1005], queue<coord>& que, int& n, int& m){
coord temp_coord;
int x, y, height, i, nx, ny;
while(!que.empty()){
temp_coord = que.front(); que.pop();
x = temp_coord.x; y = temp_coord.y; height = temp_coord.height;
for(i = 0; i < 4; ++ i){
nx = x + dir[i][0]; ny = y + dir[i][1];
if(nx < 0 || nx >= n || ny < 0 || ny >= m || visited[nx][ny]) continue;
final_map[nx][ny] = height + 1;
que.push(coord{nx, ny, height + 1});
visited[nx][ny] = true;
}
}
}
vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
vector<vector<int>> final_map;
queue<coord> que;
bool visited[1005][1005];
memset(visited, 0, sizeof(visited));
int i, j, n = isWater.size(), m = isWater[0].size();
for(i = 0; i < n; ++ i){
vector<int> map_row(m, 0);
for(j = 0; j < m; ++ j){
if(isWater[i][j]){
que.push(coord{i, j, 0});
visited[i][j] = true;
}
}
final_map.push_back(map_row);
}
BFS(final_map, visited, que, n, m);
return final_map;
}
};