有效的數獨 LeetCode(陣列的巧妙運用)
有效的數獨
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
- 數字
1-9
在每一行只能出現一次。 - 數字
1-9
在每一列只能出現一次。 - 數字
1-9
在每一個以粗實線分隔的3x3
宮內只能出現一次。
上圖是一個部分填充的有效的數獨。
數獨部分空格內已填入了數字,空白格用 '.'
表示。
示例 1:
輸入: [ ["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"] ] 輸出:true
示例 2:
輸入: [ ["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"] ] 輸出:false 解釋: 除了第一行的第一個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。 但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。
說明:
- 一個有效的數獨(部分已被填充)不一定是可解的。
- 只需要根據以上規則,驗證已經填入的數字是否有效即可。
- 給定數獨序列只包含數字
1-9
和字元'.'
。 - 給定數獨永遠是
9x9
形式的。
題解:
今天刷了好幾道題,就這題還有點意思,主要是優化,橫縱座標的有效性沒問題直接用map搞,3x3的方格的有效性我一開始是直接寫了個check函式,在函式裡用map進行驗證,後來看見別人的程式碼,覺得很巧妙,可以開一個三維陣列,假設驗證第i行第j個,那麼可以把它唯一標記為p[i/3][j/3],可以驗證(0,0),(0,1)一直到(2,2)也就是第一個方格所有座標都符合這個唯一標記,而其他的座標不符合,那麼開一個三維陣列就可以標記整張圖的每個3x3的方格里的有效性。我修改之後的時間居然跑得和原來的一樣。。莫名其妙
我修改前的程式碼:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
for(int i=0;i<9;i++)
{
map<char,int>p;
map<char,int>p1;
for(int j=0;j<9;j++)
{
if(i%3==0&&j%3==0)
{
if(!check(board,i,j))
return false;
}
if(board[i][j]!='.')
{
if(p[board[i][j]])
return false;
p[board[i][j]]=1;
}
if(board[j][i]!='.')
{
if(p1[board[j][i]])
return false;
p1[board[j][i]]=1;
}
}
}
return true;
}
bool check(vector<vector<char>>& board,int sx,int sy)
{
map<char,int>p;
for(int i=sx;i<sx+3;i++)
{
for(int j=sy;j<sy+3;j++)
{
if(board[i][j]=='.')
continue;
if(p[board[i][j]])
return false;
p[board[i][j]]=1;
}
}
return true;
}
};
我修改後的程式碼:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int p2[10][10][10];
memset(p2,0,sizeof(p2));
for(int i=0;i<9;i++)
{
map<char,int>p;
map<char,int>p1;
for(int j=0;j<9;j++)
{
if(board[i][j]!='.')
{
if(p[board[i][j]])
return false;
p[board[i][j]]=1;
int t=board[i][j]-'0';
if(p2[i/3][j/3][t])
return false;
p2[i/3][j/3][t]=1;
}
if(board[j][i]!='.')
{
if(p1[board[j][i]])
return false;
p1[board[j][i]]=1;
}
}
}
return true;
}
};
相關推薦
有效的數獨 LeetCode(陣列的巧妙運用)
有效的數獨 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充
swift 有效的數獨 - LeetCode
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的&nbs
Leetcode演算法——36、判斷有效數獨
判斷一個 9*9 的數獨面板是否是有效的。 如果已經被填充的數字滿足以下條件,則說明是有效的: 每一行只能包含無重複數字1-9 每一列只能包含無重複數字1-9 每一個 3*3 的子面板只能包含無重複數字1-9 備註: 一個有效的數獨面板(
Codewars 打怪日記 5星級kyu 數獨遊戲 我是否完成了陣列 Did I Finish my Sudoku? 看小菜和大神迴圈的巧妙運用
史蒂夫·喬布斯說過,每個人都應該學習給電腦編寫程式的技術,因為這一過程能夠教你如何去思考!學習程式設計的渠道有很多種,比如你可以利用一些互動平臺或者書籍去學習程式設計,無論是哪種,只要找到適合自己的就OK。程式設計極富有創造性,你可以創造出許多新奇有趣的想法。很多時候,開發
LeetCode 解題筆記——有效的數獨
題目描述:判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔
leetcode-36-有效的數獨
bool isValidSudoku(vector<vector<char>>& board) { int row[9][9] = {0}, col[9][9] = {0}, box[9][9] = {0}; for (int i =
二維陣列 有效的數獨 go語言
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充的有效的數獨。 數獨部分空格內已填入了數字,
Leetcode題庫——36.有效的數獨
@author: ZZQ @software: PyCharm @file: leetcode36_isValidSudoku.py @time: 2018/11/19 19:27 要求:判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現
Leetcode 有效的數獨(c++) 清晰易懂
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充的有效的數獨。 數獨部分空格內
Leetcode演算法Java全解答--36. 有效的數獨
Leetcode演算法Java全解答–36. 有效的數獨 文章目錄 Leetcode演算法Java全解答--36. 有效的數獨 題目 想法 結果 總結 程式碼 我的答案 大佬們的答案
Leetcode 的強大之處 演算法題解 in Swift ( 有效的數獨 , 36 ) 及其 Code Review
Leetcode 的強大之處,挺多的。 本文寫的是,其強大的討論區。 討論區裡面,有各種具有啟發性的程式碼。 (換句話說,就是有很強的程式碼。看了,覺得腦洞大開,大神們把語言的語法特性發揮到了極致) 裡面有各種常見語言的實現 ( 這裡指 Leetcode 主站的, 中文站點的同一功能弱了一點 )
leetcode-有效的數獨
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充的有效的數獨。 數獨部分空格內已
36.有效的數獨-Python-LeetCode
一、題目 二、解法 結語 一、題目 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現
Leetcode演算法題(C語言)11--有效的數獨
題目:有效的數獨 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 1 數字 1-9 在每一行只能出現一次。 2 數字 1-9 在每一列只能出現一次。 3 數
【leetcode】有效的數獨(Python解答)
題目: 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個
LeetCode題目--有效的數獨(python/Java實現)
題目 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以
【LeetCode】36. 有效的數獨
題目描述 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗
leetcode題庫——有效的數獨
題目描述: 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填充的有
LeetCode 36. 有效的數獨 Valid Sudoku(C語言)
題目描述: 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。 上圖是一個部分填
LeetCode-36. 有效的數獨
題目地址:https://leetcode-cn.com/problems/valid-sudoku/ 思路:暴力 AC程式碼: class Solution { public: bool isValidSudoku(vector<vector<char>&