LeetCode--36.有效的数独

发布于:2025-06-27 ⋅ 阅读:(16) ⋅ 点赞:(0)

前言:我已经有五六天没更新了吧,最近期末周了,要复习就暂时搁置了,我大概七月底弄完吧,之后就是长达两个月的不间断更新哦,可以期待一下,哈哈

解题思路:

        1.获取信息:

                给定一个9 X 9的数独,要求判断该数独是否有效

                判断数独有效的条件如下:

                (1)数字1-9在每一行只能出现一次

                (2)数字1-9在每一列只能出现一次

                (3)数字1-9在每一个以粗实线分隔的3 X 3宫内只能出现一次

        2.分析题目:(因为我只写了一种方法,所以我就直接在这个环节叙述我的思路咯)

                因为这个数独是固定的长和宽,皆为9,所以当我们依次遍历每一列或者每一行亦或是每个小的3 X 3的宫格,就算全部遍历完,我们也知道它有一个固定的,最糟糕的遍历次数,那么它就不会随不同数独变化,那么它就是一个时间复杂度为O(1)的算法

        3.示例查验:略

        4.尝试编写代码:

                (1)依次遍历

                        思路:我们前面分析题目环节时,打算依次检查来看它是否合格

                        要判断合格,我们需要检查三项,每行,每列和每个小宫格

                        如果要尽可能使遍历次数变少的话,那么最好就是对这个数独进行一次遍历来达到我们检查三项的目的

                        你可能想到的是,用某个容器来存储,然后每次存储的时候,查找里面是否有相同的数来进行判断,但这样的话,时间复杂度就会就会变得很糟糕,那么如何来解决这个问题呢?

                        我们知道在数组中使用下标来取数时间复杂度为O(1),所以可以使用数组来进行一个排除重复的操作

以下是完整代码,可以品尝一下

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        vector<vector<int>>col(9,vector<int>(9,0));//检查行
        vector<vector<int>>rol(9,vector<int>(9,0));//检查列
        vector<vector<vector<int>>>matrix(3,vector<vector<int>>(3,vector<int>(9,0)));//检查小宫格
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                if(board[i][j]!='.'){
                    int index=board[i][j]-'1';
                    col[j][index]++;
                    rol[i][index]++;
                    matrix[i/3][j/3][index]++;
                    if(col[j][index]>1||rol[i][index]>1||matrix[i/3][j/3][index]>1)return false;
                }
            }
        }
        return true;
    }
};

  好了,在阔别已久后的第一次见面,就到这里了,没有重大事件,我是不会断更的,会给它带到棺材里面的,放心吧,不会太监的,之前说的后续补充的那些,也是比较忙,就暂时搁置一下

还是提醒,纸上得来终觉浅,绝知此事要躬行


网站公告

今日签到

点亮在社区的每一天
去签到