思路分析
这里我使用了最简单的广度优先遍历方法去解决问题,与一般问题不同的是我们需要维护一个waterElevation
表示当前的水面高度。如果我们所有的已搜索的方块高度均高于水平面,我们只有将水平面升高才能接着进行下一步的广度搜索。
这一步就是用于拉高水平面的。
if(minHeap.front()[0] > waterElevation){
waterElevation = minHeap.front()[0];
continue;
}
为了每一步都能快速获取到最低的那个方块,我们可以使用小顶堆来动态地对其进行排序。
完整代码
class Solution {
public:
static bool compare(vector<int> &a, vector<int> &b){
return a[0] > b[0];
}
int swimInWater(vector<vector<int>>& grid) {
int waterElevation = 0;
vector<vector<int>> minHeap, dire{{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
minHeap.push_back({grid[0][0], 0, 0});
grid[0][0] = -1;
while(true){
if(minHeap.front()[0] > waterElevation){
waterElevation = minHeap.front()[0];
continue;
}
// arrive right-bottom
int x{minHeap.front()[1]}, y{minHeap.front()[2]};
if(x == grid.size() - 1 && y == grid[0].size() - 1)
break;
// pop heap top
// push 4-derection square
pop_heap(minHeap.begin(), minHeap.end(), compare);
minHeap.pop_back();
for( auto& dir : dire ){
int nx{x + dir[0]}, ny{y + dir[1]};
if( nx < 0 ||
nx >= grid.size() ||
ny < 0 ||
ny >= grid[0].size() ||
grid[nx][ny] == -1)
continue;
minHeap.push_back({grid[nx][ny], nx, ny});
push_heap(minHeap.begin(), minHeap.end(), compare);
grid[nx][ny] = -1;
}
}
return waterElevation;
}
};