「leetcode」36. 有效的數獨

2020-08-06 一千個蘿蔔

題目

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。


數字 1-9 在每一行只能出現一次。

數字 1-9 在每一列只能出現一次。

數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。

數獨部分空格內已填入了數字,空白格用 &39; 表示。


示例 1:

輸入:
[
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;]
]
輸出: true

示例 2:

輸入:
[
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
  [&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;]
]
輸出: false

解釋: 除了第一行的第一個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。

但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。

說明:
一個有效的數獨(部分已被填充)不一定是可解的。

只需要根據以上規則,驗證已經填入的數字是否有效即可。

給定數獨序列只包含數字 1-9 和字符 &39; 。

給定數獨永遠是 9x9 形式的。

思路

最簡單的思路的是分別循環:判斷行中沒有重複的數字,判斷列中沒有重複的數字,判斷 3 x 3 子數獨沒有重複的數字。


但能不能通過一次循環來實現呢?可以的,我們可以通過三個輔助 Map 來實現。
舉例子:

[
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;],
[&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;,&34;]
]

第0行0列5,記錄 rowMap[05] = 1, colMap[05] = 1, sudokuMap[005] = 1
第0行1列3,記錄 rowMap[03] = 1, colMap[13] = 1, sudokuMap[003] = 1
...
第i行j列N,記錄 rowMap[i + N] = 1, colMap[j + N] = 1, sudokuMap[N/3 + M/3 + N] = 1
當下一項在 rowMap || colMap || sudokuMap 中存在時,表示這不是一個有效的數獨

代碼

/**
* lang=javascript
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function (board) {
let rowMap = {};
let colMap = {};
let sudokuMap = {};

for (let row = 0; row < 9; row++) {
for (let col = 0; col < 9; col++) {
const num = board[row][col];
const rowKey = &39; + row + num;
const colKey = &39; + col + num;
const matrixKey =
&39; +
parseInt(row / 3) +
parseInt(col / 3) +
num;
if (num === &39;) continue;
else if (
rowMap[rowKey] ||
colMap[colKey] ||
sudokuMap[matrixKey]
) {
return false;
} else {
rowMap[rowKey] = 1;
colMap[colKey] = 1;
sudokuMap[matrixKey] = 1;
}
}
}

return true;
};

複雜度分析

時間複雜度:因為數獨固定是9 x 9,循環一次,所以為O(1)。

空間複雜度:使用了額外的Map來記錄,為O(1)。

執行

執行用時:96 ms, 在所有 JavaScript 提交中擊敗了69.25%的用戶。

內存消耗:43.1 MB, 在所有 JavaScript 提交中擊敗了25.92%的用戶。

相關焦點

  • leetcode第36題-有效的數獨
    上圖是一個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格用 '.' 表示。     但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/valid-sudoku解答def is_valid_sudoku
  • ​LeetCode刷題實戰36: 有效的數獨
    今天和大家聊的問題叫做 有效的數獨,我們先來看題面:https://leetcode-cn.com/problems/valid-sudoku/Determine if a 9x9 Sudoku board is valid.
  • LeetCode 圖解 | 36.有效的數獨
    今天分享一個LeetCode題,題號是36,標題是:有效的數獨,題目標籤是散列表,散列表也稱哈希表。此題解題思路用到了少量的空間換取時間的方法,降低時間上的消耗。題目描述判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字 1-9 在每一行只能出現一次。數字 1-9 在每一列只能出現一次。數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
  • LeetCode 題解 | 36. 有效的數獨
    點擊上方藍字設為星標力扣 36.
  • Leetcode No.36 有效的數獨
    一、題目描述判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
  • 「最美應用」Kudos Sudoko:可能是我玩過的最好看的數獨遊戲
    一個已解答的數獨其實是一種多了宮的限制的拉丁方陣,因為同一個數字不可能在同一行、列或宮中出現多於一次。這種遊戲只需要邏輯思維能力,與數字運算無關。雖然玩法簡單,但數字排列方式卻千變萬化,所以不少教育者認為數獨是鍛鍊腦筋的好方法。
  • 「最強大腦教你玩數獨」第1期│10分鐘快速入門,掌握數獨魅力
    輔導數獨成長官」,和各位小學猿面對面,講解數獨技巧,開發數獨思維。:四宮數獨、六宮數獨和九宮數獨,一般我們常見的是九宮數獨。:標準數獨,變形數獨。我們先從標準數獨開始學習,慢慢了解更多更好玩的變形數獨。
  • AK leetcode 流浪計劃 - 回文串
    說明:本題中,我們將空字符串定義為有效的回文串。迴文數 https://leetcode-cn.com/problems/palindrome-number/ 「轉數組 判斷」125.回文對 https://leetcode-cn.com/problems/palindrome-pairs/  「貪心 字符串查詢」409.
  • leetcode刷題最強指南(版本1.0)
    如果你在刷leetcode,強烈建議先按照本篇刷題順序來刷,刷完了你會發現對整個知識體系有一個質的飛躍,不用在題海茫然的尋找方向。目前「代碼隨想錄」刷題指南更新了:140篇文章,精講了100道經典算法題目,每個系列開始都有對應的理論基礎講解,系列結束都有對應的總結篇,部分難點題目還搭配了20分鐘左右的視頻講解。說了這麼多,那麼你現在準備好了麼,go go go!
  • 數獨遊戲
    起源既然「數獨」有一個字是「數」,人們往往會聯想到數學,那就不妨從數學家歐拉說起,但凡想了解數獨歷史的玩家在網絡、書籍中搜索時,共同會提到的就是歐拉的「拉丁方塊」。拉丁方塊的規則:每一行、每一列均含1-N(N即盤面的規格),不重複。這與標準數獨非常相似,但少了一個宮的規則。
  • 醫聯王仕銳入選36氪「36UNDER36」
    日前,36氪公布了2020年度36位36歲以下了不起的創業者榜單、新經濟之王十大領域企業榜單。醫聯創始人、CEO王仕銳入選「36UNDER36」,同時醫聯榮獲「2020年中國新經濟之王最具影響力企業」。4年前,36氪開啟36UNDER36系列評選,旨在嘉獎「在眼界、格局和創新上遠超同輩」的36人,針對「投資人&創業者」採取雙年輪換制。
  • 親子閱讀||數獨遊戲(1年級)
    數獨的玩法邏輯簡單,數字排列方式千變萬化。不少教育者認為數獨是鍛鍊腦筋的好方法。一、數獨的歷史早在數千年前,中國人就發明了九宮圖:在9個方格中,橫行和豎行的數字總和是相同的。「數獨」也不是什麼新生事物,已經存在了數百年。18世紀,瑞士數學家萊昂哈德·歐勒發明了「拉丁方塊」,但並沒有受到人們的重視。
  • 流行了 34 年的數獨遊戲,我終於在 iPhone 上找到了體驗最好的版本
    圖片來自:sherlockshome.net《數獨 2》的玩法非常簡單且易學,就是在橫豎的 9 個格子中,填入 0 到 9 之間的數字。自從 1986 年它被發明以來,數獨「困住」過無數人。奇怪的是作為新手的我在《數獨 2》中學到入門方法後也被這個遊戲「困住」,以至於一整個周日的下午都在數獨中度過。
  • 回溯法|一文解決四道 Leetcode「組合總和」題
    1.組合總和 & 組合總和 II1.1 題目描述「leetcode-39. 組合總和」給定一個無重複元素的數組 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。
  • 推薦4個基於 Java語言的開源 Leetcode 題解!算法面試不愁了!
    leetcoleetcode: https://github.com/doocs/leetcode[4]LeetCode-Solution-in-Good-Style: https://github.com/liweiwei1419/LeetCode-Solution-in-Good-Style[5]LeetCode(力扣): https://leetcode-cn.com/
  • 徐州36中附小玩轉數獨 思維「共振」
    數獨遊戲是鍛鍊思維的益智遊戲。為了鍛鍊學生的邏輯推理能力,讓學生感悟遊走在成功與失敗一線間的體會。本學期11月20日下午開始,小學部四、五、六年級共計百餘名學生齊聚二樓電教室,共同享受著數獨比賽活動給大家帶來的歡樂。
  • LeetCode-38.外觀數列(Count and Say)
    「外觀數列」是一個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/count-and-say/Link:https://leetcode.com/problems/count-and-say/模擬法第N個數是對第N - 1個數的外觀描述。
  • 運用計算、推理,試試破解這個網站裡的數獨拼詞遊戲
    、數織等遊戲,既玩法簡單,同時又是很好的思維鍛鍊,而在「puzzle」這個網站中,除了常見的數獨、數織遊戲,還有多個不同玩法的遊戲可以挑戰。「puzzle」是一個收集了多種數學玩法遊戲的網站,進入網站後直接就會開始一場數織遊戲,不過遊戲格子的初始尺寸較小,可以通過左上方的「放大鏡」圖標點擊放大,這樣可以更方便玩家進行操作。
  • 數獨,如何玩出孩子的聰明大腦?(文末可下載素材)
    玩數獨,就是一個特別好的方式。通過玩數獨,孩子能收穫嚴密的邏輯思維,同時還能收穫數感和專注力,可謂一舉多得。我強烈建議家長們和孩子一起玩數獨,在愉悅的親子時光中,盡情享受邏輯推理帶來的樂趣。相信無論對您還是孩子來說,這都將是一生中最溫馨的回憶了。
  • 【數學遊戲】數獨 第2題
    數獨遊戲進入英國後,很多人立刻迷上了它。由於該遊戲簡單易學,而且初級遊戲並不難,所以很多人在工作休息時間以及乘車上班途中都是埋頭在報紙上狂玩數獨。更有人宣稱多玩數獨遊戲可以延緩大腦衰老。      目前,英國湧現出了大量的關於數獨遊戲的書籍,專門推廣此類遊戲的網站也紛紛出現,人們可以從網上下載數獨軟體到電腦,也可以把軟體下載到手機上玩。