面试经典150题——Day34

文章目录

一、题目

36. Valid Sudoku

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

Each row must contain the digits 1-9 without repetition.

Each column must contain the digits 1-9 without repetition.

Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition.

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.

Example 1:

Input: board =

\["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: board =

\["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.

Constraints:

board.length == 9

boardi.length == 9

boardij is a digit 1-9 or '.'.

题目来源: leetcode

二、题解

我自己的笨方法

cpp 复制代码
class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        unordered_map<char,int> map;
        //遍历行
        for(int i = 0;i < 9;i++){
            //清除上行数据
            map.clear();
            for(int j = 0;j < 9;j++){
                char c = board[i][j];
                if(c != '.'){
                    if(map[c] == 0) map[c]++;
                    else if(map[c] == 1) return false;
                }
            }
        }
        //遍历列
        for(int j = 0;j < 9;j++){
            map.clear();
            for(int i = 0;i < 9;i++){
                char c = board[i][j];
                if(c != '.'){
                    if(map[c] == 0) map[c]++;
                    else if(map[c] == 1) return false;
                }
            }
        }
        //遍历3x3宫格
        for(int i = 0;i < 9;i += 3){
            for(int j = 0;j < 9;j += 3){
                map.clear();
                for(int k = i;k < i + 3;k++){
                    for(int m = j;m < j + 3;m++){
                        char c = board[k][m];
                        if(c != '.'){
                            if(map[c] == 0) map[c]++;
                            else if(map[c] == 1) return false;
                        }
                    }
                }
            }
        }
        return true;
    }
};

答案的好方法

cpp 复制代码
class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int rows[9][9];
        int columns[9][9];
        int subboxes[3][3][9];
        
        memset(rows,0,sizeof(rows));
        memset(columns,0,sizeof(columns));
        memset(subboxes,0,sizeof(subboxes));
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c != '.') {
                    int index = c - '0' - 1;
                    rows[i][index]++;
                    columns[j][index]++;
                    subboxes[i / 3][j / 3][index]++;
                    if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
};
相关推荐
圣保罗的大教堂19 分钟前
leetcode 301. 删除无效的括号 困难
leetcode
liliangcsdn33 分钟前
派息率指标的应用探索和分析
大数据·算法
xh didida42 分钟前
Linux -- 基础IO
linux·服务器·开发语言·c++
垆边人似月.1 小时前
华为机试题 :两数之和
c++·算法·华为
默默开发1 小时前
物流行业可用算法方向
算法
个 人 练 习 生1 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
垆边人似月.1 小时前
华为机试题 :有效的括号
c++·算法·华为
坤坤子吖1 小时前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
A加ITIL教练长河achotsao2 小时前
ITIL Master 战略领导者课后系列分享:AI编程正在重新划分研发与运维的边界
算法
hahaha60162 小时前
FPGA+ARM实现AWB的全流程
人工智能·嵌入式硬件·算法·计算机视觉·fpga开发