力扣35.有效的数独

链接:36. 有效的数独 - 力扣(LeetCode) (leetcode-cn.com)

题目:力扣35.有效的数独_第1张图片

分析,判断数独成立三个条件

1.每行不出现重复元素,2.每列不出现重复元素,3.每个小正方块不出现重复元素

前两个方法好实现,数字都是1-9,且每一行都可以容纳9个数字,我们可以把数组对应的数值标记到对应的位置,并且区分重复的元素(正负数,boolean),只要出现两次直接返回false,跳出循环。

第三步比较难想,我们也可以把问题抽象话只要每一个小的9宫格里面的9个数字不出现重复就可以,把他抽成一行,第一九宫格占一行

技巧:一个九宫格中每个元素的下标索引可以通过公式划分为一组

第几组元素=(行/3)+(列/3)*3

第几列=nums[行][列]-1

把对应元素置换成组别,如图

力扣35.有效的数独_第2张图片

力扣35.有效的数独_第3张图片

代码;

   public boolean isValidSudoku(char[][] board) {
//        数组的boolean的值默认为false
//        每一行的值
        boolean[][] rowUsed = new boolean[9][9];
//        每一列的值
        boolean[][] colUsed = new boolean[9][9];
//每一个正方形里的值
        boolean[][] boxUsed = new boolean[9][9];
        int n = board.length;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
//                ""里面包含的是字符串,''里面包含的是字符
                if (board[i][j] != '.') {
                    int m = board[i][j] - '1';
//                    每一行第一次出现会标记为true,第二次出现,验证为true就会直接退出程序
                    if (rowUsed[i][m] == false) {
                        rowUsed[i][m] = true;
                    } else {
                        return false;
                    }
//                    每列出现一次
                    if (colUsed[m][j] == false) {
                        colUsed[m][j] = true;
                    } else {
                        return false;
                    }
//                    一个1九宫格里面只出现一次
                    int boxIndex = (i / 3) + (j / 3) * 3;
                    if (boxUsed[boxIndex][m] == false) {
                        boxUsed[boxIndex][m] = true;
                    } else {
                        return false;
                    }
                }
            }
        }
        return true;
    }

你可能感兴趣的:(算法,java)