36. Valid Sudoku

一、题目

  1、审题

  2、分析

    一个 9 * 9 的棋盘,其中 ‘ . ’ 代表未填写,判断其中填写的数字是否符合如下特点:

      a、每行的数字不重复

      b、每列的数字不重复

      c、每个3*3 的小棋盘中数字不重复

 

二、解答

  1、思路:

    用双层循环,其中外循环 i 代表 X 轴坐标, j 代表 Y轴坐标。 则 [i, j] 为每一行的坐标, [j, i] 为每一列的坐标。同时, [i /3 * 3 + j / 3 , i % 3 * 3 + j % 3] 正好为第 i 个3* 3单元格的第 j 个格点坐标。最终利用 Set 判断数字是否重复。

  

public class Solution {
    public boolean isValidSudoku(char[][] board) {
        
        // 因此第i个九宫格的第j个格点的行号可表示为i/3*3+j/3
//        i / 3 * 3 + j / 3
        
        for (int i = 0; i < 9; i++) {
            // 表示第 i 个九宫格
            HashSet<Character> row = new HashSet<Character>();  
            HashSet<Character> column = new HashSet<Character>();  
            HashSet<Character> cube = new HashSet<Character>();  
            
            // 检查第 i 行
            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;
                
                // 九宫格 坐标
                int rowNum = i / 3 * 3 + j / 3;
                int columnNum = i % 3 * 3 + j % 3;
                if(board[rowNum][columnNum] != '.' && !cube.add(board[rowNum][columnNum])) 
                    return false;
            }
        }
        
        return true;
    
    }
}

 

      

 

posted @ 2018-08-09 09:13  skillking2  阅读(126)  评论(0编辑  收藏  举报