36. 有效的数独 @Python @Go

有效数独算法实现

原题

https://leetcode.cn/problems/valid-sudoku/description/

思路

遍历 + 集合

复杂度

时间:O(n)
空间:O(1)

Python代码

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        for i in range(9):
            # 数字 1-9 在每一行只能出现一次
            row = [board[i][j] for j in range(9) if board[i][j] != '.']
            if len(set(row)) < len(row):
                return False 
            # 数字 1-9 在每一列只能出现一次
            col = [board[j][i] for j in range(9) if board[j][i] != '.']
            if len(set(col)) < len(col):
                return False 

        for i in range(0, 9, 3):
            for j in range(0, 9, 3):
                # 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次
                l = [board[i+x][j+y] for x in range(3) for y in range(3) if board[i+x][j+y] != '.']
                if len(set(l)) < len(l):
                    return False 
        return True
       

Go代码

func isValidSudoku(board [][]byte) bool {
	for i := 0; i < 9; i++ {
		// 数字 1-9 在每一行只能出现一次
		row := map[byte]bool{}
		for j := 0; j < 9; j++ {
			if board[i][j] != '.' {
				// 出现重复值
				if row[board[i][j]] {
					return false
				} else {
					row[board[i][j]] = true
				}
			}
		}
		// 数字 1-9 在每一列只能出现一次
		col := map[byte]bool{}
		for j := 0; j < 9; j++ {
			if board[j][i] != '.' {
				// 出现重复值
				if col[board[j][i]] {
					return false
				} else {
					col[board[j][i]] = true
				}
			}
		}
	}

	for i := 0; i < 9; i = i + 3 {
		for j := 0; j < 9; j = j + 3 {
			// 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次
			sub := map[byte]bool{}
			for x := 0; x < 3; x++ {
				for y := 0; y < 3; y++ {
					if board[i+x][j+y] != '.' {
						if sub[board[i+x][j+y]] {
							return false
						} else {
							sub[board[i+x][j+y]] = true
						}
					}
				}
			}
		}
	}
	return true
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值