LeetCode--36. 有效的数独(java)

原题链接
方法1:无脑遍历每个格子,若该格子是数字,检查该数字是否可行,只要有一个不可行的,返回false。
手段比较简单暴力,所以效率比较低

public class Solution {
	//leftUpArr[i] 表示 i 号 3*3网格的左上角格子的行与列
	String[] leftUpArr = new String[] {"00", "03", "06", "30", "33", "36", "60", "63", "66"};

	public boolean isValidSudoku(char[][] board) {
		if(board == null || board.length == 0) return false;
		for(int i = 0;i < board.length;i++) {
			for(int j = 0;j < board[0].length;j++) {
				if(board[i][j] != '.') {
					if(!isValid(board, i, j)) return false;
				}
			}
		}
		return true;
    }

	private boolean isValid(char[][] board, int row, int col) {
		for(int i = 0;i < 9;i++) {
			if(i == row) continue;
			//检查col列
			if(board[i][col] == board[row][col]) return false;
		}
		for(int j = 0;j < 9;j++) {
			if(j == col) continue;
			//检查row行
			if(board[row][j] == board[row][col]) return false;
			
		}
		int gridNum = (row / 3) * 3 + col / 3;//获取(row,col)所在的3*3九宫格的编号
		//如果该九宫格中,不能在放 board[row][col]这个值
		if(!checkGrid(board, gridNum, row, col, board[row][col])) return false;
		
		return true;
	}
	
	private boolean checkGrid(char[][] board, int gridNum,int row,int col, char c) {
		String leftUp = leftUpArr[gridNum];//该3*3九宫格的左上角
		int leftUpRow = Integer.valueOf(leftUp.charAt(0)+"");//左上角的行
		int leftUpCol = Integer.valueOf(leftUp.charAt(1)+"");//列
		for(int i = leftUpRow;i < leftUpRow + 3;i++) {//遍历这个3*3的九宫格
			for(int j = leftUpCol;j < leftUpCol + 3;j++) {				
				if(i == row && j == col) {//如果遍历到(row, col)这个位置就跳过
					continue;
				}else if(board[i][j] != '.' && board[i][j] == c) return false;
			}
		}
		return true;
	}
}

在这里插入图片描述
方法2: 数组
摘自题解区,对比大佬的代码,感觉自己的好 low … =.=!

class Solution {
    public boolean isValidSudoku(char[][] board) {
        // 记录某行,某位数字是否已经被摆放
        boolean[][] row = new boolean[9][9];
        // 记录某列,某位数字是否已经被摆放
        boolean[][] col = new boolean[9][9];
        // 记录某 3x3 宫格内,某位数字是否已经被摆放
        boolean[][] block = new boolean[9][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    int num = board[i][j] - '1';//数字从1开始,所以需要-1,转化为该数字对应的索引
                    int blockIndex = i / 3 * 3 + j / 3;
                    if (row[i][num] || col[j][num] || block[blockIndex][num]) {
                        return false;
                    } else {
                        row[i][num] = true;
                        col[j][num] = true;
                        block[blockIndex][num] = true;
                    }
                }
            }
        }
        return true;
    }
}

在这里插入图片描述

发布了24 篇原创文章 · 获赞 3 · 访问量 524

猜你喜欢

转载自blog.csdn.net/QinLaoDeMaChu/article/details/104032493