LeetCode第三十六题-判断九宫格是否有效

Valid Sudoku

问题简介:确定9x9数独格是否有效, 只需要根据以下规则验证已填充的单元格:
1.每行必须包含数字1-9而不重复
2.每列必须包含数字1-9而不重复
3.网格的9个3x3子框中的每一个必须包含数字1-9而不重复
注:
1.数独板(部分填充)可能有效,但不一定是可解决的
2.只需要根据上述规则验证已填充的单元格
3.给定的板只包含数字1-9和字符’.’
4.给定的电路板尺寸始终为9x9
举例:
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:
Input:
[
[“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
解释: 左上角的3*3里有两个8所以答案为false

解法一:
通过set集合对每行每列的元素进行判断,这里的难点是在小的33九宫格里,要注意小九宫格坐标的计算,观察:
观察行号规律:
第 i=0 个九宫格:000111222; 第1个九宫格:000111222; 第2个九宫格:000111222;第3个九宫格:333444555; 第4个九宫格:333444555; 第5个九宫格:333444555;第6个九宫格:666777888; 第7个九宫格:666777888; 第8个九宫格:666777888;
可见对于每三个九宫格行号增3;即可表示为对3作商,因此第i个九宫格的第j个格点的行号加偏移量可表示为i/3
3+j/3
观察列号规律:
第0个九宫格:012012012; 第1个九宫格:345345345; 第2个九宫格:678678678;第3个九宫格:012012012; 第4个九宫格:345345345; 第5个九宫格:678678678;第6个九宫格:012012012; 第7个九宫格:345345345; 第8个九宫格:678678678;
可见对于下个九宫格列号增3,循环周期为3;对于单个九宫格,每个格点行号增1,周期也为3。因此第i个九宫格的第j个格点的列号加偏移量可表示为i%3*3+j%3

class Solution {
	public boolean isValidSudoku(char[][] board) {
		for (int i = 0; i < 9; i++) {
			HashSet<Character> row = new HashSet<>();
			HashSet<Character> column = new HashSet<>();
			HashSet<Character> cube = new HashSet<>();
			for (int j = 0; j < 9; j++) {
				// 检查横向
				if (board[i][j] != '.' && !row.add(board[i][j]))
					return false;
				// 检查纵向
				if (board[j][i] != '.' && !column.add(board[j][i]))
					return false;
				//每个3*3的小九宫格位置
				// 行号+偏移量
				int RowIndex = 3 * (i / 3) + j / 3;
				// 列号+偏移量
				int ColIndex = 3 * (i % 3) + j % 3;
				if (board[RowIndex][ColIndex] != '.' 
						&& !cube.add(board[RowIndex][ColIndex]))
					return false;
			}
		}
		return true;
    }   
}

小白刷题之路,请多指教— — 要么大器晚成,要么石沉大海

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值