码迷,mamicode.com
首页 > 其他好文 > 详细

Valid Sudoku

时间:2015-02-28 21:32:40      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

https://oj.leetcode.com/problems/valid-sudoku/

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 ‘.‘.

技术分享

A partially filled sudoku which is valid.

 

Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

解题思路:

根据上面对于sudoku的定义,能够写出来。只要对每行和没列,以及九个小格子,都申明一个set,然后把不是‘.‘的格子中的值都放入set中,如果有重复就说明不是sudoku。

这里将行和列的check放一起,小格子的check单独列开了。需要注意的是,每个set申明的地方。第二个四重循环可能会有点晕。

public class Solution {
    public boolean isValidSudoku(char[][] board) {
        //同时check行和列
        for(int i = 0; i < board.length; i++){
            Set<Character> lineSet = new HashSet<Character>();
            Set<Character> coloumnSet = new HashSet<Character>();
            for(int j = 0; j < board[0].length; j++){
                if(board[i][j] != ‘.‘){
                    if(board[i][j] < ‘0‘ || board[i][j] > ‘9‘){
                        return false;
                    }
                    if(lineSet.contains(board[i][j])){
                        return false;
                    }else{
                        lineSet.add(board[i][j]);
                    }
                }
                if(board[j][i] != ‘.‘){
                    if(board[j][i] < ‘0‘ || board[j][i] > ‘9‘){
                        return false;
                    }
                    if(coloumnSet.contains(board[j][i])){
                        return false;
                    }else{
                        coloumnSet.add(board[j][i]);
                    }
                }
            }
        }
        
        //check九个小格子
        for(int i = 0; i < 9; i = i + 3){
            for(int j = 0; j < 9; j = j + 3){
                Set<Character> matrixSet = new HashSet<Character>();
                for(int m = i; m < i + 3; m++){
                    for(int n = j; n < j + 3; n++){
                        if(board[m][n] != ‘.‘){
                            if(matrixSet.contains(board[m][n])){
                                return false;
                            }else{
                                matrixSet.add(board[m][n]);
                            }
                        }
                    }
                }
            }
        }
        return true;
    }
}

这个解法,虽然第二个是四重循环,但是可以看到外面两层都是常数循环次数的,也就是3。而且每个元素也都被遍历了一次而已。所以其实时间复杂度只有O(n^2),n为棋盘的长或宽。

Valid Sudoku

标签:

原文地址:http://www.cnblogs.com/NickyYe/p/4305841.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!