LeetCode-36. Valid Sudoku

来源:互联网 发布:喜马拉雅mac版 编辑:程序博客网 时间:2024/06/01 10:03

一、问题描述

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

The Sudoku board could be partially filled, where empty cells are filled with the character'.'.

二、问题思路

检查每行每列,以及独立的九宫格是否包含重复的元素。


本题主要的难点在于九宫格重复元素的查找,如果将整个网格划分为上左,上中,上右;中左,中中,中右;下左,下中,下右九个块。

首先考虑上左块,j从0-9,横坐标是每隔3个加1,纵坐标是0-1-2三个数的循环,因此,容易想到横坐标是 j/3;纵坐标是j%3.

然后考虑上中块,发现上中块的横坐标与上左块对应位置的横坐标完全无变化,同理上右块;而中块横坐标比上块对应位置的增加3,下块横坐标比上块对应位置增加6,因此,可以推得横坐标的计算公式为(i/3)*3+j/3。上中块的纵坐标比上左块对应位置增加3,上右块比上左块增加6,而左三块,对应位置的纵坐标完全相等,同理中三块,右三块,可以推得纵坐标的计算公式为(i%3)*3+j%3

三\代码如下

public class Solution {    public boolean isValidSudoku(char[][] board) {        for(int i=0;i<9;i++){            HashSet<Character> rows=new HashSet<Character>();            HashSet<Character> cloumns=new HashSet<Character>();            HashSet<Character> cube=new HashSet<Character>();            for(int j=0;j<9;j++){                if(board[i][j]!='.' && !rows.add(board[i][j]))                    return false;                if(board[j][i]!='.' && !cloumns.add(board[j][i]))                    return false;                int rowindex=3*(i/3)+j/3;                int cloindex=3*(i%3)+j%3;                if(board[rowindex][cloindex]!='.' && !cube.add(board[rowindex][cloindex]))                    return false;            }        }        return true;    }}

0 0