leetcode第36題-有效的數獨

2021-03-02 測試工程師小站

上圖是一個部分填充的有效的數獨。

數獨部分空格內已填入了數字,空白格用 '.' 表示。

示例 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 存在, 因此這個數獨是無效的。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/valid-sudoku

解答

def is_valid_sudoku(board):
    """
    自己寫的
    :type board: List[List[str]]
    :rtype: bool
    """
    dict_column = {}  # 列的集合
    for a in range(9):
        dict_column[a] = []
    dict_block = {}  # 3X3方塊的集合
    for b in range(9):
        dict_block[b] = []

    for i in range(len(board)):
        for j in range(len(board)):
            # 判斷行
            if (board[i][j] != '.') and (board[i].count(board[i][j]) > 1):
                return False
            # 裝填dict_column
            dict_column[j].append(board[i][j])
        # 裝填dict_block
        for k in range(3):
            dict_block[i/3+k+i/3*2].extend(board[i][3*k:3*k+3])

    # 判斷列
    for column in dict_column.values():
        for x in range(8):  # 最後一個必定不會重複,所以不用判斷
            if (column[x] != '.') and (column.count(column[x]) > 1):
                return False
    # 判斷3X3方塊
    for block in dict_block.values():
        for y in range(8):
            if (block[y] != '.') and (block.count(block[y]) > 1):
                return False
    return True

官方解法

首先,讓我們來討論下面兩個問題:

可以使用 box_index = (row / 3) * 3 + columns / 3,其中 / 是整數除法。

可以利用 value -> count 哈希映射來跟蹤所有已經遇到的值。

現在,我們完成了這個算法的所有準備工作:

def is_valid_sudoku1(board):
    # init data
    rows = [{} for i in range(9)]
    columns = [{} for i in range(9)]
    boxes = [{} for i in range(9)]

    # validate a board
    for i in range(9):
        for j in range(9):
            num = board[i][j]
            if num != '.':
                num = int(num)
                box_index = (i // 3) * 3 + j // 3

                # keep the current cell value
                rows[i][num] = rows[i].get(num, 0) + 1
                print rows[i][num]
                columns[j][num] = columns[j].get(num, 0) + 1
                boxes[box_index][num] = boxes[box_index].get(num, 0) + 1

                # check if this value has been already seen before
                if rows[i][num] > 1 or columns[j][num] > 1 or boxes[box_index][num] > 1:
                    return False
    return True


if __name__ == "__main__":
    a=[
  ["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"]
]
    b=[
  ["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"]
]
    print is_valid_sudoku1(a)
    print is_valid_sudoku1(b)

相關焦點

  • ​LeetCode刷題實戰36: 有效的數獨
    所以,為了提高大家的算法能力,這個公眾號後續每天帶大家做一道算法題,題目就從LeetCode上面選 !今天和大家聊的問題叫做 有效的數獨,我們先來看題面:https://leetcode-cn.com/problems/valid-sudoku/Determine if a 9x9 Sudoku board is valid.
  • LeetCode 題解 | 36. 有效的數獨
    點擊上方藍字設為星標力扣 36.
  • LeetCode 圖解 | 36.有效的數獨
    今天分享一個LeetCode題,題號是36,標題是:有效的數獨,題目標籤是散列表,散列表也稱哈希表。此題解題思路用到了少量的空間換取時間的方法,降低時間上的消耗。數獨上圖是一個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格用 '.' 表示。
  • Leetcode No.36 有效的數獨
    一、題目描述判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
  • 「leetcode」36. 有效的數獨
    題目判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字 1-9 在每一行只能出現一次。數字 1-9 在每一列只能出現一次。數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
  • 數獨:一道很簡單的數獨題,附上次有趣的數獨題答案
    現在很多大公司,在招人時都會要求做數獨題,這種現象使我對數獨產生了濃厚的興趣。
  • 數獨遊戲每日一題第5題(含參考答案)
    數獨盤面是個九宮,每一宮又分為九個小格。在這八十一格中給出一定的已知數字和解題條件,利用邏輯和推理,在其他的空格上填入1-9的數字。使1-9每個數字在每一行、每一列和每一宮中都只出現一次,所以又稱「九宮格」。趣味數獨適合一二年級孩子玩,既可以鍛鍊孩子的邏輯思維能力,又能培養孩子的數感。
  • 【數學遊戲】數獨 第2題
    「數獨」跨越了文字和文化的疆域,被譽為一種全球化時代的益智遊戲。每通過一道「數獨」關,都是一次精彩的腦力探險!(要想深入了解數獨,請耐心往下閱讀)第1題答案:第2題:(答案明天見!)宮:粗黑線劃分的區域,標準數獨中為3×3的9個單元格的集合;由三個連續宮組成大區塊(Chute),分大行區塊(Floor)及大列區塊(Tower)。第一大行區塊:由第一宮、第二宮、第三宮組成。第二大行區塊:由第四宮、第五宮、第六宮組成。第三大行區塊:由第七宮、第八宮、第九宮組成。
  • LeetCode 系列 第5題
    複習了一下第5題, 這篇文章Review一下思路和代碼P0005
  • 【數學遊戲】數獨 第1題
    數獨遊戲進入英國後,很多人立刻迷上了它。由於該遊戲簡單易學,而且初級遊戲並不難,所以很多人在工作休息時間以及乘車上班途中都是埋頭在報紙上狂玩數獨。更有人宣稱多玩數獨遊戲可以延緩大腦衰老。      目前,英國湧現出了大量的關於數獨遊戲的書籍,專門推廣此類遊戲的網站也紛紛出現,人們可以從網上下載數獨軟體到電腦,也可以把軟體下載到手機上玩。
  • 玩數獨=高智商:五字異形數獨規則、解題技巧及24道挑戰題
    我們已經分享過很多數獨學習資料,如【五字標準數獨60題】【連體四宮格數獨62題】【對角線四宮格數獨72題】【連體六宮格數獨訓練
  • 每天一道數獨題,佳學慧帶你由淺入深學數獨
    相信家長們都會有這樣的經歷,在培訓班或者在網上看到有人宣傳練習數獨的好處,就抱著好奇的心態買了一套數獨盤或者數獨練習冊。但是在連猜帶蒙做了兩道題後就被卡住了。看到練習冊上明明寫的是簡單級別的題,開始懷疑人生。久而久之買來的數獨盤或者練習冊就開始躺在角落裡吃灰了。
  • Leetcode題解 WordBreak
    上述將返回true,因為"leetcode"可以分割成"leet code".  由於本題每個組成成分都是單詞,也就是每次在原有字符串的返回true的基礎上增加一個字典中的單詞來組成新的能夠返回true的字符串.發現這是一種全局同一限制性的求解問題,限制條件是每次字符串增加的都是一個存在於字典中的單詞.舉個例子說明一下:  比如字符串是"leetcodeisnice
  • 數獨:一道學士級別的進階題,附學士級別的入門題答案
    現在很多跨國大公司,在招人時都會要求做數獨題,這種現象使很多人對數獨產生了濃厚的興趣。「數獨」是一種邏輯智力遊戲,數獨日語名是sudoku,目前這名字已被全世界所採納。圖2一道學士級別的進階數獨題其實數獨題根據難易程度可以分為:學士級、碩士級、博士級、專家級,下面讓咱們來看看一道學士級別的入門題吧
  • 最強大腦第四季不規則數獨規則介紹 數獨技巧口訣帶圖解析
    《最強大腦》第四季最新一期的節目中,有四位數獨屆的高手前來迎接挑戰,而挑戰成功的選手就要和國外的選手進行PK了,那麼本期節目中挑戰的數獨,規則是什麼?還有玩數獨有沒有小技巧呢?數獨的口訣是什麼?和魔方差不多嗎?   本期的數獨獨pk賽戰一共兩輪,第一輪共三次比拼:第一次是標準數獨排位賽,共三題,根據三題完成時間排除四人排名。
  • 預告| 《新加坡小學數學應用題》+《少年讀三國》+奧數火柴客、數獨偵探社,36合一多功能棋玩教具,等你來↓
    4.36合一多功能棋,包括常見的跳棋、五子棋、圍棋、飛行棋、鬥獸棋、中國象棋、西洋棋……等等甚至還有數獨(光數獨就配了一整本430種謎題)適玩年齡:3歲+原價188元,賢爸團購價158元5.數獨偵探社,含四宮格、六宮格、九宮格、對角線和窗口數獨5種模式,輕鬆入門,
  • leetcode第242題-有效的字母異位詞
    來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/valid-anagram解答def is_anagram1(s, t):    """    轉換成列表對比,效率很低    :type s: str    :type t: str    :rtype: bool
  • LeetCode刷題第三周【數組(簡單)】
    第 k 個缺失的正整數(難度:簡單)Oct.28 刷題請點擊或見附錄:1539. 第 k 個缺失的正整數[3]題目要求:給你一個 嚴格升序排列 的正整數數組 arr 和一個整數 k 。第 k 個缺失的正整數: https://leetcode-cn.com/problems/kth-missing-positive-number/[4]刷題請點擊或見附錄:747.
  • Leetcode刷題-動態規劃
    示例 1:輸入: "babad"輸出: "bab"注意: "aba" 也是一個有效答案。提示:思路:令dp(i,j)表示從第i到j個字母之間最大回文子序列的長度,那麼和上面第五題一樣,我們上面的轉移方程只適用於子串長度大於等於3 的,對於小於3的,我們有:
  • 一道大波浪數獨題解法及帶來的思考
    世智聯數獨月賽(WPF Sudoku Grand Prix) 2020第七期由德國和荷蘭人聯合出題,題目的質量相當高,這裡介紹一下最後一題差五數獨