前言:我已经有五六天没更新了吧,最近期末周了,要复习就暂时搁置了,我大概七月底弄完吧,之后就是长达两个月的不间断更新哦,可以期待一下,哈哈
解题思路:
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;
}
};
好了,在阔别已久后的第一次见面,就到这里了,没有重大事件,我是不会断更的,会给它带到棺材里面的,放心吧,不会太监的,之前说的后续补充的那些,也是比较忙,就暂时搁置一下
还是提醒,纸上得来终觉浅,绝知此事要躬行