Comments (6)
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for (auto i = 0; i < 9; ++i) {
auto rowFlag = vector<bool>(10, false);
auto colFlag = vector<bool>(10, false);
auto blockFlag = vector<bool>(10, false);
for (auto j = 0; j < 9; ++j) {
if (board[i][j] != '.') {
auto num = board[i][j] - '0';
if (rowFlag[num]) return false;
rowFlag[num] = true;
}
if (board[j][i] != '.') {
auto num = board[j][i] - '0';
if (colFlag[num]) return false;
colFlag[num] = true;
}
auto row = (i/3)*3 + j/3;
auto col = (i%3)*3 + j%3;
if (board[row][col] != '.') {
auto num = board[row][col] - '0';
if (blockFlag[num]) return false;
blockFlag[num] = true;
}
}
}
return true;
}
};
from leetcode.
思路有点土:
首先检查行,每行一个map记录出现的数字,如果重复,立马结束,返回false
再检查列,思路同行的检查
最后检查九宫格,这里我直接手写坐标,放在数组里,然后挨个遍历
/**
*
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function (board) {
// 检查行
for (var i = 0; i < board.length; i++) {
var map = {};
for (var j = 0; j < board[i].length; j++) {
if (board[i][j] == '.') continue;
if (map[board[i][j]]) {
return false;
} else {
map[board[i][j]] = 1;
}
}
}
// 检查列
for (var i = 0; i < 9; i++) {
var map = {};
for (var j = 0; j < 9; j++) {
if (board[j][i] == '.') continue;
if (map[board[j][i]]) {
return false;
} else {
map[board[j][i]] = 1;
}
}
}
// 检查九宫格
var startAndEnd = [
[0, 2, 0, 2], // [0]:行的起始位置,[1]:行的结束位置,[2]:列的起始位置,[3]:列的结束位置
[0, 2, 3, 5],
[0, 2, 6, 8],
[3, 5, 0, 2],
[3, 5, 3, 5],
[3, 5, 6, 8],
[6, 8, 0, 2],
[6, 8, 3, 5],
[6, 8, 6, 8]
]
for (var i = 0; i < startAndEnd.length; i++) {
var item = startAndEnd[i];
var map = {};
for (var j = item[0]; j <= item[1]; j++) {
for (var n = item[2]; n <= item[3]; n++) {
if (board[j][n] == '.') continue;
if (map[board[j][n]]) {
return false;
} else {
map[board[j][n]] = 1;
}
}
}
}
return true;
};
from leetcode.
思路有点土:
首先检查行,每行一个map记录出现的数字,如果重复,立马结束,返回false
再检查列,思路同行的检查
最后检查九宫格,这里我直接手写坐标,放在数组里,然后挨个遍历/** * * @param {character[][]} board * @return {boolean} */ var isValidSudoku = function (board) { // 检查行 for (var i = 0; i < board.length; i++) { var map = {}; for (var j = 0; j < board[i].length; j++) { if (board[i][j] == '.') continue; if (map[board[i][j]]) { return false; } else { map[board[i][j]] = 1; } } } // 检查列 for (var i = 0; i < 9; i++) { var map = {}; for (var j = 0; j < 9; j++) { if (board[j][i] == '.') continue; if (map[board[j][i]]) { return false; } else { map[board[j][i]] = 1; } } } // 检查九宫格 var startAndEnd = [ [0, 2, 0, 2], // [0]:行的起始位置,[1]:行的结束位置,[2]:列的起始位置,[3]:列的结束位置 [0, 2, 3, 5], [0, 2, 6, 8], [3, 5, 0, 2], [3, 5, 3, 5], [3, 5, 6, 8], [6, 8, 0, 2], [6, 8, 3, 5], [6, 8, 6, 8] ] for (var i = 0; i < startAndEnd.length; i++) { var item = startAndEnd[i]; var map = {}; for (var j = item[0]; j <= item[1]; j++) { for (var n = item[2]; n <= item[3]; n++) { if (board[j][n] == '.') continue; if (map[board[j][n]]) { return false; } else { map[board[j][n]] = 1; } } } } return true; };
简单粗暴,只是后面手写坐标吓到我我了
from leetcode.
class Solution { public: bool isValidSudoku(vector<vector<char>>& board) { for (auto i = 0; i < 9; ++i) { auto rowFlag = vector<bool>(10, false); auto colFlag = vector<bool>(10, false); auto blockFlag = vector<bool>(10, false); for (auto j = 0; j < 9; ++j) { if (board[i][j] != '.') { auto num = board[i][j] - '0'; if (rowFlag[num]) return false; rowFlag[num] = true; } if (board[j][i] != '.') { auto num = board[j][i] - '0'; if (colFlag[num]) return false; colFlag[num] = true; } auto row = (i/3)*3 + j/3; auto col = (i%3)*3 + j%3; if (board[row][col] != '.') { auto num = board[row][col] - '0'; if (blockFlag[num]) return false; blockFlag[num] = true; } } } return true; } };
整体代码还是很容易懂的,就是blockFlag部分的row和col有点技巧。
auto row = (i/3)*3 + j/3;
auto col = (i%3)*3 + j%3
from leetcode.
领取
class Solution {
public:
bool visrow[10],viscol[10],vis3x3[10];
bool isValidSudoku(vector<vector<char>>& board) {
for(int i = 0;i<9;i++){ //同时遍历行列
memset(visrow,0,sizeof visrow);
memset(viscol,0,sizeof viscol);
for(int j = 0;j<9;j++){
if(board[i][j]!='.'){
if(visrow[board[i][j]-'0']) return false;
else visrow[board[i][j]-'0'] = 1;
}
if(board[j][i]!='.'){
if(viscol[board[j][i]-'0']) return false;
else viscol[board[j][i]-'0'] = 1;
}
}
}
for(int i = 0;i<9;i+=3){//遍历每个3x3的左上角
for(int j = 0;j<9;j+=3){
memset(vis3x3,0,sizeof vis3x3);
for(int ii = i;ii<i+3;ii++){
for(int jj = j;jj<j+3;jj++){
if(board[ii][jj]!='.'){
if(vis3x3[board[ii][jj]-'0']) return false;
else vis3x3[board[ii][jj]-'0'] = 1;
}
}
}
}
}
return true;
}
};
from leetcode.
领取
class Solution { public: bool visrow[10],viscol[10],vis3x3[10]; bool isValidSudoku(vector<vector<char>>& board) { for(int i = 0;i<9;i++){ //同时遍历行列 memset(visrow,0,sizeof visrow); memset(viscol,0,sizeof viscol); for(int j = 0;j<9;j++){ if(board[i][j]!='.'){ if(visrow[board[i][j]-'0']) return false; else visrow[board[i][j]-'0'] = 1; } if(board[j][i]!='.'){ if(viscol[board[j][i]-'0']) return false; else viscol[board[j][i]-'0'] = 1; } } } for(int i = 0;i<9;i+=3){//遍历每个3x3的左上角 for(int j = 0;j<9;j+=3){ memset(vis3x3,0,sizeof vis3x3); for(int ii = i;ii<i+3;ii++){ for(int jj = j;jj<j+3;jj++){ if(board[ii][jj]!='.'){ if(vis3x3[board[ii][jj]-'0']) return false; else vis3x3[board[ii][jj]-'0'] = 1; } } } } } return true; } };
done
from leetcode.
Related Issues (20)
- 树专题中双色标记法后序和前序写反了 HOT 2
- leetcode/thinkings/tree.md 出错 HOT 1
- some error
- 二分查找专题,寻找最左/右插入位置算法模板错误问题 HOT 9
- possible code error in thinkings/heap.md HOT 1
- link error HOT 4
- link is not correct
- [695.最大岛屿面积,360,面试原题]【每日一题】 HOT 3
- 【专题】 反向思考 HOT 3
- 【专题】 考虑每一项对结果到的贡献
- 【专题】递推方程时间复杂度优化
- 已发布文章的代码错误 HOT 7
- Remove duplicate CPP solution and add Python solution for problem 100.same-tree
- Add OSSF Scorecard security workflow
- 题目的排版可否改一改
- 关于二分法中查找中间点索引的算式 HOT 6
- leetcode-thinkings-tree.md BFS 模版调整 HOT 3
- anki-card 中只有10道题吗?截止到2023.11 HOT 1
- 【每日一题】- 2020-xx-xx - xxx
- 大佬,考虑出一个最短路径的专题吗 HOT 8
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from leetcode.