LeetCode - Valid Sudoku | Darren's Blog



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 '.'. Below is a partially filled sudoku which is valid.
Each row must have the numbers 1-9 occuring just once.
Each column must have the numbers 1-9 occuring just once.
And the numbers 1-9 must occur just once in each of the 9 sub-boxes of the grid.
  • With three passes
public boolean isValidSudoku(char[][] board) {
    HashSet<Character> set = new HashSet<Character>();
    // Check for each row
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            if (board[i][j] == '.')
                continue;
            if (set.contains(board[i][j]))
                return false;
            set.add(board[i][j]);
        }
        set.clear();
    }
 
    // Check for each column
    for (int j = 0; j < 9; j++) {
        for (int i = 0; i < 9; i++) {
            if (board[i][j] == '.')
                continue;
            if (set.contains(board[i][j]))
                return false;
            set.add(board[i][j]);
        }
        set.clear();
    }
 
    // Check for each sub-grid
    for (int k = 0; k < 9; k++) {
        for (int i = k/3*3; i < k/3*3+3; i++) {
            for (int j = (k%3)*3; j < (k%3)*3+3; j++) {
                if (board[i][j] == '.')
                    continue;
                if (set.contains(board[i][j]))
                    return false;
                set.add(board[i][j]);
            }
        }
        set.clear();
    }
 
    return true;
}
Code from http://xixiaogualu.blogspot.com/2013/09/leetcode-valid-sudoku.html
public boolean isValidSudoku(char[][] board) {
for(int i=0;i<9;i++){ //check rows
boolean[] checker=new boolean[10];
for(int k=1;k<10;k++)
checker[k]=false;
for(int j=0;j<9;j++){
char c=board[i][j];
//System.out.println(c-'0');
if(c=='.')
continue;
else if(checker[c-'0'])
return false;
else
checker[c-'0']=true;
}
}
for(int i=0;i<9;i++){ //check rows
boolean[] checker=new boolean[10];
for(int k=1;k<10;k++)
checker[k]=false;
for(int j=0;j<9;j++){
char c=board[j][i];
if(c=='.')
continue;
else if(checker[c-'0'])
return false;
else
checker[c-'0']=true;
}
}
for(int i=0;i<9;i+=3) //check 9-sub
for(int j=0;j<9;j+=3){
boolean[] checker=new boolean[10];
for(int k=1;k<10;k++)
checker[k]=false;
for(int m=0;m<3;m++)
for(int n=0;n<3;n++){
char c=board[i+m][j+n];
if(c=='.')
continue;
else if(checker[c-'0'])
return false;
else
checker[c-'0']=true;
}
}
return true;
}
  • With one pass
public boolean isValidSudoku(char[][] board) {
    // rowChecker[i][j]=true: j appears in row i
    boolean[][] rowChecker = new boolean[9][9];
    // columnChecker[i][j]=true: j appears in column i
    boolean[][] columnChecker = new boolean[9][9];
    // gridChecker[i][j]=true: j appears in grid i
    // numberring from left to right, then top to bottom
    boolean[][] gridChecker = new boolean[9][9];
 
    // One-pass scan in row-major manner
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            if (board[i][j] == '.')
                continue;
            int val = board[i][j] - '1';
            // Check for the corresponding row, column, and grid at the same time
            if (rowChecker[i][val] || columnChecker[j][val] || gridChecker[i/3*3+j/3][val])
                return false;
            rowChecker[i][val] = columnChecker[j][val] = gridChecker[i/3*3+j/3][val] = true;
        }
    }
    return true;
}
Read full article from LeetCode - Valid Sudoku | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts