LeetCode 36——有效的數獨
1. 題目
2. 解答
將數獨中數字的 ASCII 碼值轉化到 0-8 之間作為雜湊值,建立一個雜湊表,然後分別逐行、逐列、逐宮(3*3小塊)統計每個數字的出現次數,若出現次數大於 1,則數獨無效。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int table[9] = {0};
int i = 0, j = 0;
int index = 0;
// 逐行掃描,判斷數字 1-9 在每一行是否只出現一次
for (i = 0; i < 9; i++)
{
for (int m = 0; m < 9; m++)
{
table[m] = 0;
}
for (j = 0; j < 9; j++)
{
if (board[i][j] != 46)
{
index = board[i][j] - 49; // 將數字的 ASCII 轉化為 1-9
table[index]++;
if (table[index] > 1)
{
return false;
}
}
}
}
// 逐列掃描,判斷數字 1-9 在每一列是否只出現一次
for (i = 0; i < 9; i++)
{
for (int m = 0; m < 9; m++)
{
table[m] = 0;
}
for (j = 0; j < 9; j++)
{
if (board[j][i] != 46)
{
index = board[j][i] - 49;
table[index]++;
if (table[index] > 1)
{
return false;
}
}
}
}
// 逐塊掃描,判斷數字 1-9 在每一塊是否只出現一次
int row = 0;
int col = 0;
for (int m = 0; m < 3; m++)
{
row = m * 3;
for (int n = 0; n < 3; n++)
{
col = n * 3;
for (int k = 0; k < 9; k++)
{
table[k] = 0;
}
for (i = row; i < row+3; i++)
{
for (j = col; j < col+3; j++)
{
if (board[i][j] != 46)
{
index = board[i][j] - 49;
table[index]++;
if (table[index] > 1)
{
return false;
}
}
}
}
}
}
return true;
}
};
上面的方法需要對數獨遍歷三次,我們也可以做到在遍歷一次的情況下判斷數獨是否有效。
針對每行、每列和每宮分別建立一個雜湊表,然後在遍歷數獨的時候,根據下標 的變化確定三個雜湊表的值,若其中一個值大於 1,則數獨無效。
其中,通過下標 來獲取如下宮的順序可以通過 來獲取。
1 | 2 | 3 | |
4 | 5 | 6 | |
7 | 8 | 9 |
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int table1[9][9] = {0}, table2[9][9] = {0}, table3[9][9] = {0};
int i = 0, j = 0;
int index = 0;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
if (board[i][j] != 46)
{
index = board[i][j] - 49; // 將數字的 ASCII 轉化為 0-8
table1[i][index]++;
// 行雜湊表
if (table1[i][index] > 1)
{
return false;
}
// 列雜湊表
table2[j][index]++;
if (table2[j][index] > 1)
{
return false;
}
// 宮雜湊表
table3[i/3*3+j/3][index]++;
if (table3[i/3*3+j/3][index] > 1)
{
return false;
}
}
}
}
return true;
}
};
獲取更多精彩,請關注「seniusen」!
相關文章
- leetcode:有效的數獨LeetCode
- Leetcode 的強大之處 Swift Code Review 演算法題 ( 有效的數獨 , 36 )LeetCodeSwiftView演算法
- leetCode 36. Valid Sudoku(數獨) 雜湊LeetCode
- LeetCode-367-有效的完全平方數LeetCode
- LeetCode 37. 解數獨LeetCode
- [LeetCode] Sudoku Solver 求解數獨LeetCode
- 讓我們一起啃演算法----有效的數獨演算法
- [LeetCode] Valid Sudoku 驗證數獨LeetCode
- [leetcode]有效的括號LeetCode
- leetcode37 解數獨問題 hardLeetCode
- Leetcode 36 Valid SudokuLeetCode
- leetcode36&37_SudukuSolverLeetCode
- uniapp js 數獨小遊戲 寫死的簡單數獨 數獨 3.0APPJS遊戲
- Leetcode20. 有效的括號LeetCode
- Leetcode——20. 有效的括號LeetCode
- 【LeetCode-棧】有效的括號LeetCode
- LeetCode有效的括號(Python)LeetCodePython
- LeetCode 20. 有效的括號LeetCode
- 【LeetCode】 20.有效的括號LeetCode
- [LeetCode]1207. 獨一無二的出現次數LeetCode
- LeetCode 242 有效的字母異位詞(JAVA)LeetCodeJava
- Leetcode——242:有效字母的異位詞LeetCode
- vue 數獨Vue
- 數獨遊戲遊戲
- 保障獨享代理IP有效率的四大因素
- 取有效數字
- 【LeetCode 36_雜湊表】Valid SudokuLeetCode
- LeetCode-20. 有效的括號(棧模擬)LeetCode
- java解數獨Java
- 拉丁方的衍生遊戲“數獨”遊戲
- 一個解數獨的程式
- 【LeetCode從零單排】No36 Valid SudokuLeetCode
- Leetcode 20 有效的括號valid-parentheses(棧)LeetCode
- 數獨遊戲技巧(轉)遊戲
- 《雜湊表》242. 有效的字母異位詞《leetcode》LeetCode
- Leetcode 611. 有效三角形的個數 (排序後雙指標優化)LeetCode排序指標優化
- PostgreSQL生成任意基數數獨-2SQL
- PostgreSQL生成任意基數數獨-3SQL