有效的数独
https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2f9gg/
https://leetcode-cn.com/problems/valid-sudoku
我的方法
容易想到的是使用哈希表来记录一行/一列/一个方格内是否出现了重复值。
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
| bool isValidSudoku(vector<vector<char>>& board) { int n = board.size(); unordered_set<char> row, col, grid;
for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (board[i][j] != '.' && !(row.insert(board[i][j]).second)) { return false; } if (board[j][i] != '.' && !(col.insert(board[j][i]).second)) { return false; } if (i%3==0 && j%3==0) { for (int x = 0; x < 3; ++x) { for (int y = 0; y < 3; ++y) { if (board[i+x][j+y] != '.' && !(grid.insert(board[i+x][j+y]).second)) { return false; } } } } grid.clear(); } row.clear(); col.clear(); }
return true; }
|
每一行和每一列是否有重复值比较好搞,但是如何在一次遍历中就记录方格里的值呢?
我的方法是判断遍历到的值是不是方格左上角的元素,是的话再遍历整个方格。这样实际上多了不必要的访问。
更好的方法
如何在一次遍历就访问到方格里的元素呢?大家可能很好奇如何在一次遍历就访问到方格里的元素。方法就是
1 2
| int m = j / 3 + i / 3 * 3; int n = j % 3 + i % 3 * 3;
|
小编也很奇怪,为什么可以这样呢?
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
| bool isValidSudoku(vector<vector<char>>& board) { int n = board.size(); unordered_set<char> row, col, grid;
for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (board[i][j] != '.' && !(row.insert(board[i][j]).second)) { return false; } if (board[j][i] != '.' && !(col.insert(board[j][i]).second)) { return false; }
int m = j / 3 + i / 3 * 3; int n = j % 3 + i % 3 * 3; if (board[m][n] != '.' && !(grid.insert(board[m][n]).second)) { return false; } } row.clear(); col.clear(); grid.clear(); }
return true; }
|