最直接的解法應該是對9*9的數組進行3次遍歷,分別判斷是否符合要求。下面是代碼:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int i, j;
// 先判斷行是否符合要求
for (i = 0; i < 9; i++)
{
vector<int> visited(10, 0);
for (j = 0; j < 9; j++)
{
if (board[i][j] == '.')
visited[0]++;
else
{
int index = board[i][j] - '0';
visited[index]++;
}
}
if ( !isRepeated(visited) )
return false;
}
// 再判斷列是否符合要求
for (j = 0; j < 9; j++)
{
vector<int> visited(10, 0);
for (i = 0; i < 9; i++)
{
if (board[i][j] == '.')
visited[0]++;
else
{
int index = board[i][j] - '0';
visited[index]++;
}
}
if ( !isRepeated(visited) )
return false;
}
// 最後判斷每個3*3區域是否符合要求
for (i = 0; i <= 6; i += 3)
{
for (j = 0; j <= 6; j += 3)
{
vector<int> visited(10, 0);
for (int row = i; row <= i+2; row++)
{
for (int col = j; col <= j+2; col++)
{
if (board[row][col] == '.')
visited[0]++;
else
{
int index = board[row][col] - '0';
visited[index]++;
}
}
}
if ( !isRepeated(visited) )
return false;
}
}
return true;
}
// 判斷標記數組是否合法
bool isRepeated(vector<int>& visited)
{
for (int i = 1; i <= 9; i++)
{
if (visited[i] >= 2)
return false;
}
return true;
}
};
但是仔細觀察代碼,只需增加額外空間,遍歷的次數便能縮減到一次。這是典型的空間換時間策略。
需要做的就是開出額外的空間。