leetcode36——有效的数独

题意

判断一个9*9的数独是否有效,必须满足以下3个条件:

1、数字1-9在每一行只能出现一次
2、数字1-9在每一列只能出现一次
3、数字1-9在每一个3*3宫格内只能出现一次

解法

  • 暴力解法:

首先逐行判断,其次逐列判断,再其次逐个3*3宫格内判断:

class Solution {
    //暴力解法
    public static boolean isValidSudoku(char[][] board) {
        int[] ints;
        //判断行
        for (int i = 0; i < 9; i++) {
            ints = new int[10];
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c == '.') {
                    continue;
                }
                if (ints[Integer.parseInt(String.valueOf(c))] >= 1) {
                    return false;
                }
                ints[Integer.parseInt(String.valueOf(c))]++;
            }
        }

        //判断列
        for (int i = 0; i < 9; i++) {
            ints = new int[10];
            for (int j = 0; j < 9; j++) {
                char c = board[j][i];
                if (c == '.') {
                    continue;
                }
                if (ints[Integer.parseInt(String.valueOf(c))] >= 1) {
                    return false;
                }
                ints[Integer.parseInt(String.valueOf(c))]++;
            }
        }

        //判断3 * 3宫格
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                ints = new int[10];
                for (int ii = i * 3; ii < i * 3 + 3; ii++) {
                    for (int jj = j * 3; jj < j * 3 + 3; jj++) {
                        char c = board[ii][jj];
                        if (c == '.') {
                            continue;
                        }
                        if (ints[Integer.parseInt(String.valueOf(c))] >= 1) {
                            return false;
                        }
                        ints[Integer.parseInt(String.valueOf(c))]++;
                    }
                }
            }
        }
        return true;
    }
}
  • 缓存解法:

使用二维数组,双层循环,逐个判断存储当前行、列、box的元素的个数,如果个数为1,返回false,否则个数分别+1;

class Solution {
    //暴力解法
    public static boolean isValidSudoku(char[][] board) {
        //整个board有9行,第二维的维数10是为了让下标有9,和数独中的数字9对应。

        //哈希表存储每一行的每个数是否出现过,默认初始情况下,每一行每一个数字没有出现过
        int[][] row = new int[9][10];
        //存储每一列的每个数是否出现过,默认初始情况下,每一列的每一个数都没有出现过
        int[][] col = new int[9][10];
        //存储每一个box的每一个数是否出现过,默认初始情况下,在每个box中,每个数都没有出现过,整个board数组有9个box
        int[][] box = new int[9][10];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                //遍历到第i行第j列的数字,要判断在所在的行有没有出现过
                //同时判断在所在的列有没有出现过
                //同时判断在所在的box中有没有出现过
                if (board[i][j] == '.')
                    continue;
                int curNumber = board[i][j] - '0';
                if (row[i][curNumber] == 1)
                    return false;
                if (col[j][curNumber] == 1)
                    return false;
                if (box[j / 3 + (i / 3) * 3][curNumber] == 1)
                    return false;
                // 之前都没出现过,现在出现了,就给它置为1,下次再遇见就能够直接返回false了
                row[i][curNumber] = 1;
                col[j][curNumber] = 1;
                box[j / 3 + (i / 3) * 3][curNumber] = 1;
            }
        }
        return true;
    }
}
上一篇:三子棋C语言实现


下一篇:C语言实现三子棋游戏