• #Leetcode# 36. Valid Sudoku


    https://leetcode.com/problems/valid-sudoku/

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

    1. Each row must contain the digits 1-9 without repetition.
    2. Each column must contain the digits 1-9 without repetition.
    3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.


    A partially filled sudoku which is valid.

    The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

    Example 1:

    Input:
    [
      ["5","3",".",".","7",".",".",".","."],
      ["6",".",".","1","9","5",".",".","."],
      [".","9","8",".",".",".",".","6","."],
      ["8",".",".",".","6",".",".",".","3"],
      ["4",".",".","8",".","3",".",".","1"],
      ["7",".",".",".","2",".",".",".","6"],
      [".","6",".",".",".",".","2","8","."],
      [".",".",".","4","1","9",".",".","5"],
      [".",".",".",".","8",".",".","7","9"]
    ]
    Output: true
    

    Example 2:

    Input:
    [
      ["8","3",".",".","7",".",".",".","."],
      ["6",".",".","1","9","5",".",".","."],
      [".","9","8",".",".",".",".","6","."],
      ["8",".",".",".","6",".",".",".","3"],
      ["4",".",".","8",".","3",".",".","1"],
      ["7",".",".",".","2",".",".",".","6"],
      [".","6",".",".",".",".","2","8","."],
      [".",".",".","4","1","9",".",".","5"],
      [".",".",".",".","8",".",".","7","9"]
    ]
    Output: false
    Explanation: Same as Example 1, except with the 5 in the top left corner being 
        modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.
    

    Note:

    • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
    • Only the filled cells need to be validated according to the mentioned rules.
    • The given board contain only digits 1-9 and the character '.'.
    • The given board size is always 9x9.

    代码:

    class Solution {
    public:
        bool isValidSudoku(vector<vector<char>>& board) {
            map<char, int> mp;
            bool flag = true;
            for(int i = 0; i < 9; i ++) {
                mp.clear();
                for(int j = 0; j < 9; j ++) {
                    mp[board[i][j]] ++;
                    for(int k = 1; k <= 9; k ++) {
                        if(mp['0' + k] > 1) {
                            flag = false;
                            break;
                        }
                    }
                }
                mp.clear();
                for(int j = 0; j < 9; j ++) {
                    mp[board[j][i]] ++;
                    for(int k = 1; k <= 9; k ++) {
                        if(mp['0' + k] > 1) {
                            flag = false;
                            break;
                        }
                    }
                }
            }
            
            mp.clear();
            for(int i = 0; i < 9 ; i += 3) {
                for(int j = 0; j < 9; j += 3) {
                    mp.clear();
                    for(int l = i; l < i + 3; l ++) {
                        for(int r = j; r < j + 3; r ++) {
                            mp[board[l][r]] ++;
                            for(int k = 1; k <= 9; k ++) {
                                if(mp['0' + k] > 1) {
                                    flag = false;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            return flag;
        }
    };
    

    写了无数个 $for$ 循环的时候就知道时间复杂度高的不行了。。。题目写的可清楚但是第一次写的时候还是没看到每个 $3 * 3$ 小方块里面也要互不相同

     $vector$ 啊 一直不怎么会用 emmmm 先去看看 $vector$ 再继续撸题 8 !

    题解代码:

    class Solution {
    public:
        bool isValidSudoku(vector<vector<char> > &board) {
            if (board.empty() || board[0].empty()) return false;
            int m = board.size(), n = board[0].size();
            vector<vector<bool> > rowFlag(m, vector<bool>(n, false)); // row[m][n] 初始化为 false
            vector<vector<bool> > colFlag(m, vector<bool>(n, false));
            vector<vector<bool> > cellFlag(m, vector<bool>(n, false));
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (board[i][j] >= '1' && board[i][j] <= '9') {
                        int c = board[i][j] - '1';
                        if (rowFlag[i][c] || colFlag[c][j] || cellFlag[3 * (i / 3) + j / 3][c]) return false;
                        rowFlag[i][c] = true;
                        colFlag[c][j] = true;
                        cellFlag[3 * (i / 3) + j / 3][c] = true;
                    }
                }
            }
            return true;
        }
    };
    

      

  • 相关阅读:
    概率论
    Python3爬虫爬取淘宝商品数据
    利用Python数据分析基础
    Linux安装MATLAB2016a
    python3爬取高清壁纸(2)
    python3爬取高清壁纸(1)
    Git使用基础
    Python3基础
    正则表达式的使用基础
    Nginx配置多域名代理
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10000796.html
Copyright © 2020-2023  润新知