• 36. 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.

    链接: http://leetcode.com/problems/valid-sudoku/

    题解:

    验证数独,分三次验证行,列以及9个3x3子块就可以了。

    Time Complexity - O(n2), Space Complexity - O(1)。

    public class Solution {
        public boolean isValidSudoku(char[][] board) {
            if(board == null || board.length == 0)
                return false;
            HashSet<Character> set = new HashSet<Character>();
            
            for(int i = 0; i < 9; i++) {
                for(int j = 0; j < 9; j++) {
                    if(board[i][j] != '.' && set.contains(board[i][j]))
                        return false;
                    set.add(board[i][j]);
                }
                set.clear();
            }
            
            for(int j = 0; j < 9; j++) {
                for(int i = 0; i < 9; i++) {
                    if(board[i][j] != '.' && set.contains(board[i][j]))
                        return false;
                    set.add(board[i][j]);
                }
                set.clear();
            }
            
            for(int i = 1; i < 9; i += 3) {
                for(int j = 1; j < 9; j += 3) {
                    for(int k = -1; k <= 1; k++) {
                        for(int l = -1; l <= 1; l++) {
                            if(board[i + k][j + l] != '.' && set.contains(board[i + k][j + l]))
                                return false;
                            set.add(board[i + k][j + l]);
                        }
                    }
                    set.clear();
                }
            }
             
            return true;   
        }
    }

    二刷:

    Java:

    依然是 Time Complexity - O(n2) , Space Complexity - O(1)。这样遍历了三次数组,并不是很快,可以继续优化,只遍历一次数组。

    public class Solution {
        public boolean isValidSudoku(char[][] board) {
            if (board == null || board.length == 0) {
                return false;
            }
            Set<Character> set = new HashSet<>();
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    if (board[i][j] != '.' && !set.add(board[i][j])) {
                        return false;
                    }
                }
                set.clear();
            }
            
            for (int j = 0; j < board[0].length; j++) {
                for (int i = 0; i < board.length; i++) {
                    if (board[i][j] != '.' && !set.add(board[i][j])) {
                        return false;
                    }
                }
                set.clear();
            }       
            
            for (int i = 1; i < board.length; i += 3) {
                for (int j = 1; j < board[0].length; j += 3) {
                    for (int k = -1; k <= 1; k++) {
                        for (int l = -1; l <= 1; l++) {
                            if (board[i + k][j + l] != '.' && !set.add(board[i + k][j + l])) {
                                return false;
                            }
                        }
                    }
                    set.clear();
                }
            }
            return true;
        }
    }

    只遍历一次数组,代码主要来自于Lorraine921:

    public class Solution {
        public boolean isValidSudoku(char[][] board) {
            if (board == null || board.length == 0) {
                return false;
            }
            Set<Character> rows = new HashSet<Character>();
            Set<Character> cols = new HashSet<Character>();
            Set<Character> cube = new HashSet<Character>();
            for(int i = 0; i < 9; i++){
                for (int j = 0; j < 9;j++){
                    if(board[i][j] != '.' && !rows.add(board[i][j])) {
                        return false;
                    }
                    if(board[j][i] != '.' && !cols.add(board[j][i])) {
                        return false;
                    }
                    int RowIndex = 3 * (i / 3);
                    int ColIndex = 3 * (i % 3);
                    if(board[RowIndex + j / 3][ColIndex + j % 3]!= '.' && !cube.add(board[RowIndex + j / 3][ColIndex + j % 3])) {
                        return false;
                    }
                }
                rows.clear();
                cols.clear();
                cube.clear();
            }
            return true;
        }
    }

    三刷:

    看来三刷并没有吸取到二刷的精华,上面的解法完全忘记了。需要再领会。

    Java:

    public class Solution {
        public boolean isValidSudoku(char[][] board) {  // assume len = 9
            if (board == null || board.length == 0) {
                return false;
            }
            Set<Integer> set = new HashSet<>();
            for (int i = 0; i < 9; i++) {
                set.clear();
                for (int j = 0; j < 9; j++) {
                    if (board[i][j] != '.' && !set.add(board[i][j] - '0')) {
                        return false;
                    }
                }
            }
            for (int j = 0; j < 9; j++) {
                set.clear();
                for (int i = 0; i < 9; i++) {
                    if (board[i][j] != '.' && !set.add(board[i][j] - '0')) {
                        return false;
                    }
                }
            }
            for (int i = 1; i < 9; i += 3) {
                for (int j = 1; j < 9; j += 3) {
                    set.clear();
                    for (int k = -1; k <= 1; k++) {
                        for (int l = -1; l <= 1; l++) {
                            if (board[i + k][j + l] != '.' && !set.add(board[i + k][j + l] - '0')) {
                                return false;
                            }
                        }
                    }
                }
            }
            return true;
        }
    }

    Reference:

    https://leetcode.com/discuss/48737/1-7-lines-python-4-solutions

    https://leetcode.com/discuss/27272/shared-my-concise-java-code

    https://leetcode.com/discuss/23901/my-short-solution-by-c-o-n2

    https://leetcode.com/discuss/17990/sharing-my-easy-understand-java-solution-using-set

    https://leetcode.com/discuss/92445/yet-another-java-2ms-solution

  • 相关阅读:
    CF1168B Good Triple 性质分析
    bzoj 4994: [Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组_排序
    BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机+栈
    BZOJ 1691 [Usaco2007 Dec]挑剔的美食家 multiset+排序+贪心
    BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归
    BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra
    BZOJ 1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏 幼儿园测试题
    BZOJ 5508: [Tjoi2019]甲苯先生的字符串 矩阵乘法_思维
    BZOJ 1602: [Usaco2008 Oct]牧场行走 倍增裸题
    描述符get/set/delete,init/new/call,元类
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4436318.html
Copyright © 2020-2023  润新知