LeetCode036——有效的数独

版权声明:版权所有,转载请注明原网址链接。 https://blog.csdn.net/qq_41231926/article/details/82585501

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/valid-sudoku/description/

题目描述:

知识点:哈希表

思路一:遍历三次二维数组

用一个长度为9的数组来存储每一行、每一列、每一3 * 3宫中的数字。如果出现重复数字,则说明该九宫格无效。

(1)第一次遍历时,判断每一行中的数字是否有效。一旦发现任意一行无效,直接返回false。

(2)第二次遍历时,判断每一列中的数字是否有效。一旦发现任意一列无效,直接返回false。

(3)第三次遍历时,判断每一3 * 3宫中的数字是否有效。一旦发现任意一个九宫格无效,直接返回false。

如果最后通过了上述三重遍历的校验,说明该九宫格是有效的,返回true。

由于我们的九宫格大小是固定的,这里不再分析时间复杂度和空间复杂度。

JAVA代码:

public class Solution {

	public boolean isValidSudoku(char[][] board) {
		//to ensure every row is valid
		for (int i = 0; i < 9; i++) {
			int[] flags = new int[9];
			for(int j = 0; j < 9; j++) {
				char temp = board[i][j];
				if(temp != '.') {
					if(flags[temp - '0' - 1] == 1) {
						return false;
					}else {
						flags[temp - '0' - 1] = 1;
					}
				}
			}
		}
		//to ensure every column is valid
		for (int j = 0; j < 9; j++) {
			int[] flags = new int[9];
			for(int i = 0; i < 9; i++) {
				char temp = board[i][j];
				if(temp != '.') {
					if(flags[temp - '0' - 1] == 1) {
						return false;
					}else {
						flags[temp - '0' - 1] = 1;
					}
				}
			}
		}
		//to ensure every 3*3 palace is valid
		for(int p = 0; p <= 6; p += 3) {
			for(int k = 0; k <= 6; k += 3) {
				int[] flags = new int[9];
				for (int i = p; i < p + 3; i++) {
					for(int j = k; j < k + 3; j++) {
						char temp = board[i][j];
						if(temp != '.') {
							if(flags[temp - '0' - 1] == 1) {
								return false;
							}else {
								flags[temp - '0' - 1] = 1;
							}
						}
					}
				}
			}
		}
		return true;
	}
}

LeetCode解题报告:

思路二:遍历一次二维数组

对于一次遍历,我们需要在遍历数组中每一个元素的时候同时更新九宫格中每一个元素对应列、对应行、对应3 * 3宫中的信息。难点在于:对于坐标为(i, j)的元素,其属于第i行,第j列,但是属于哪个3 * 3宫呢?

如果发现不了坐标为(i, j)的元素属于哪个3 * 3宫的数学规律,我们的程序就要多写几行if-else的判断语句。其实这个规律很简单,坐标为(i, j)的元素属于第((i / 3) * 3 + j / 3)个3 * 3宫。这里假设我们3 * 3宫是从0开始标号的,第一行为0, 1, 2,第二行为3, 4, 5,第三行为6, 7, 8。

由于我们的九宫格大小是固定的,这里不再分析时间复杂度和空间复杂度。

JAVA代码:

public class Solution {
	
	public boolean isValidSudoku(char[][] board) {
		List<int[]> rowFlags = new ArrayList<>();
		List<int[]> columnFlags = new ArrayList<>();
		List<int[]> palaceFlags = new ArrayList<>();
		for(int i = 0; i < 9; i++) {
			rowFlags.add(new int[9]);
			columnFlags.add(new int[9]);
			palaceFlags.add(new int[9]);
		}
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				char temp = board[i][j];
				if(temp == '.') {
					continue;
				}
				if(rowFlags.get(i)[temp - '0' - 1] == 1) {
					return false;
				}else {
					rowFlags.get(i)[temp - '0' - 1] = 1;
				}
				if(columnFlags.get(j)[temp - '0' - 1] == 1) {
					return false;
				}else {
					columnFlags.get(j)[temp - '0' - 1] = 1;
				}
				if(palaceFlags.get((i / 3) * 3 + j / 3)[temp - '0' - 1] == 1) {
					return false;
				}else {
					palaceFlags.get((i / 3) * 3 + j / 3)[temp - '0' - 1] = 1;
				}
			}
		}
		return true;
	}
}

LeetCode解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/82585501