1: class Solution { 2: public: 3: void wallsAndGates(vector<vector<int>>& rooms) { 4: int row = rooms.size(); 5: if (row == 0) return; 6: int col = rooms[0].size(); 7: vector<pair<int, int>> dir = {{1,0}, {-1,0}, {0,1}, {0,-1}}; 8: queue<pair<int, int>> reach; 9: for (int i = 0; i < row; i++) { 10: for (int j = 0; j < col; j++) { 11: if (rooms[i][j] == 0) { 12: reach.push(make_pair(i, j)); 13: } 14: } 15: } 16: while (!reach.empty()) { 17: int i1 = reach.front().first; 18: int j1 = reach.front().second; 19: reach.pop(); 20: for (int k = 0; k < dir.size(); k++) { 21: int i2 = i1 + dir[k].first; 22: int j2 = j1 + dir[k].second; 23: if (i2 < 0 || j2 < 0 || i2 == row || j2 == col ||
rooms[i2][j2] <= rooms[i1][j1]+1
) continue; 24: rooms[i2][j2] = rooms[i1][j1] + 1; 25: reach.push(make_pair(i2, j2)); 26: } 27: } 28: } 29: };
When I revisited this problem, I used BFS as following but it turns out much slower than the way I did in this post. Then I rechecked the implementation and realized that the solution in this post actually performs multi-end BFS which reduced the running time to O(2n*n). The way I did runs O(k*n*n) where k is the number of gates.
1: class Solution {
2: public:
3: void wallsAndGates(vector<vector<int>>& rooms) {
4: int rows = rooms.size();
5: if (rows == 0) return;
6: int cols = rooms[0].size();
7: queue<pair<int,int>> q;
8: vector<pair<int,int>> dir = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
9: for (int i = 0; i < rows; i++) {
10: for (int j = 0; j < cols; j++) {
11: if (rooms[i][j] == 0) {
12: q.push(make_pair(i, j));
13: while (!q.empty()) {
14: int n = q.size();
15: for (int k = 0; k < n; k++) {
16: int x = q.front().first;
17: int y = q.front().second;
18: q.pop();
19: for (int d = 0; d < dir.size(); d++) {
20: int xx = x + dir[d].first;
21: int yy = y + dir[d].second;
22: if (xx<0 || xx==rows || yy<0 || yy==cols || rooms[xx][yy]==-1 || rooms[x][y]+1>=rooms[xx][yy]) continue;
23: rooms[xx][yy] = rooms[x][y] + 1;
24: q.push(make_pair(xx, yy));
25: }
26: }
27: }
28: }
29: }
30: }
31: }
32: };
No comments:
Post a Comment