知识点

哈希表 模拟

思路

这道题的宫格的规则是说在那个范围内的数字只能出现一次,其他数字不管

实际上思路很简单,就是遍历每一行,每一列看是否满足要求;如果满足的话可以遍历每一个位置,计算出所属的宫格,之后依照对应的要求进行判断。判断是否存在可以开哈希表,但没啥必要,常数比较大。可以开一个大小为10的布尔数组记录一下是否出现过即可。

只遍历整个数组若干次,时间复杂度为O(n^2)

AC Code(C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param board char字符型vector<vector<>> 
     * @return bool布尔型
     */
    const int n = 9;
    using PCC = pair<char, char>;
    bool isValidTwilightSudoku(vector<vector<char> >& board) {
        for (int i = 0; i < n; i ++) {
            if (!checkRow(board, i)) return false;
            if (!checkCol(board, i)) return false;
        }
        vector<PCC> lim(9);
        lim[0] = lim[4] = lim[8] = {'1', '3'};
        lim[1] = lim[5] = {'4', '6'};
        lim[2] = lim[6] = {'7', '9'};
        lim[3] = lim[7] = {'1', '9'};
        vector<vector<bool>> st(9, vector<bool>(10, false));
        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < n; j ++) {
                if (board[i][j] == '.') continue;
                auto c = board[i][j];
                int t = i / 3 * 3 + j / 3;
                if (c < lim[t].first or c > lim[t].second) continue;
                if (st[t][c - '0']) return false;
                st[t][c - '0'] = true;
            }
        }
        return true;
    }
    bool checkRow(vector<vector<char>>& g, int x) {
        vector<bool> st(10, false);
        for (int i = 0; i < n; i ++) {
            if (g[x][i] == '.') continue;
            int u = g[x][i] - '0';
            if (st[u]) return false;
            st[u] = true; 
        }
        return true;
    }
    bool checkCol(vector<vector<char>>& g, int x) {
        vector<bool> st(10, false);
        for (int i = 0; i < n; i ++) {
            if (g[i][x] == '.') continue;
            int u = g[i][x] - '0';
            if (st[u]) return false;
            st[u] = true; 
        }
        return true;
    }
};