Leetcode——有效的数独

Posted Yawn,

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——有效的数独相关的知识,希望对你有一定的参考价值。

1. 题目

请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。

示例 1:
在这里插入图片描述
在这里插入图片描述

提示:
board.length == 9
board[i].length == 9
board[i][j] 是一位数字或者 ‘.’

2. 题解

按照从左往右,从上往下的顺序遍历一次,
只需要比较同行,同列,同box是否存在相同的值,可分为三个维度,把每个数字放在对应位置,判断是否存在即可,不用考虑同时符合三个维度条件,单一判断即可

class Solution {
    public boolean isValidSudoku(char[][] board) {
		int[][] row = new int[9][9];
		int[][] col = new int[9][9];
		int[][][] box = new int[3][3][9];  //存储每一个box的每个数是否出现过,默认初始情况下,在每个box中,每个数都没有出现过。整个board有9个box。
		for(int i = 0; i < board.length; i++){
			for(int j = 0; j < board[0].length; j++){
			// 遍历到第i行第j列的那个数,我们要判断这个数在其所在的行有没有出现过,
                // 同时判断这个数在其所在的列有没有出现过
                // 同时判断这个数在其所在的box中有没有出现过
				if(board[i][j] == '.') {
					continue;
				}
				int num = board[i][j] - '0' - 1;    //-‘0’为了把char转int,-1为了得到真实坐标值0-8
				if(row[i][num] == 1 || col[j][num] == 1 || box[i / 3][j / 3][num] == 1){
					return false;
				}
				row[i][num] = 1;	// 之前都没出现过,现在出现了,就给它置为1,下次再遇见就能够直接返回false了。
				col[j][num] = 1;
				box[i / 3][j / 3][num] = 1;
			}
		}
		return true;
    }
}

以上是关于Leetcode——有效的数独的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 36有效的数独

leetcode 有效的数独

Leetcode中等36. 有效的数独JavaScript

[LeetCode]数组——有效的数独

每日LeetCode一道题————有效的数独

leetcode36. 有效的数独