O(mn) time
基本思路是先标记每行以及每列连续三个相同的candy,然后对每一列从下往上进行更新,最后反复更新board直到没有再需要调整的candy为止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public: vector<vector<int>> candyCrush(vector<vector<int>>& board) { int R = board.size(), C = board[0].size(); bool changed = false; for (int r = 0; r < R; ++r) { for (int c = 0; c + 2 < C; ++c) { int v = abs(board[r][c]); if (v != 0 && v == abs(board[r][c + 1]) && v == abs(board[r][c + 2])) { board[r][c] = board[r][c + 1] = board[r][c + 2] = -v; changed = true; } } } for (int r = 0; r + 2 < R; ++r) { for (int c = 0; c < C; ++c) { int v = abs(board[r][c]); if (v != 0 && v == abs(board[r + 1][c]) && v == abs(board[r + 2][c])) { board[r][c] = board[r + 1][c] = board[r + 2][c] = -v; changed = true; } } } if (!changed) return board; for (int c = 0; c < C; ++c) { int i = R - 1; for (int r = R - 1; r >= 0; --r) { if (board[r][c] > 0) { board[i--][c] = board[r][c]; } } for (; i >= 0; --i) { board[i][c] = 0; } } return candyCrush(board); } };
|