36. 有效的數獨

題目鏈接

最直接的解法應該是對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;
    }
};

但是仔細觀察代碼,只需增加額外空間,遍歷的次數便能縮減到一次。這是典型的空間換時間策略。

需要做的就是開出額外的空間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章