欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

36. Valid Sudoku

程序员文章站 2022-07-15 12:31:45
...

题目链接:https://leetcode.com/problems/valid-sudoku/description/

该题的思路比较明确,按照数独的要求判断即可:

1.判断每一行没有重复的元素;

2.判断每一列没有重复的元素;

3.判断每一个9宫格没有重复的元素。

关于元素个数的统计,一是可以采用count数组,二是用hashmap。代码如下:

class Solution {
   public static boolean isValidSudoku(char[][] board) {
	int[] count=new int[10];
	for(int i=0;i<9;i++) {//判断行是否有重复数字
		clear(count);
		for(int j=0;j<9;j++) {
			char c=board[i][j];
			if(c!='.') {
				count[c-'0']++;
			    if(count[c-'0']>=2)
				    return false;
			}	
		}	
	}
	
	for(int j=0;j<9;j++) {//判断列是否有重复数字
		clear(count);
		for(int i=0;i<9;i++) {
			char c=board[i][j];
			if(c!='.') {
				count[c-'0']++;
			    if(count[c-'0']>=2)
				    return false;
			}	
		}	
	}
	
	for(int i=0;i<7;i=i+3) {//判断九宫格是否有重复数字
	  for(int j=0;j<7;j=j+3) {
		clear(count);
		for(int r=i;r<i+3;r++) {
			for(int l=j;l<j+3;l++) {
			char c=board[r][l];
			if(c!='.') {
				count[c-'0']++;
			    if(count[c-'0']>=2)
				    return false;
			}	
		}	
	}
	}
	}
	
	return true;    
    }
private static void clear(int[] nums) {
	for(int i=0;i<nums.length;i++)
		nums[i]=0;
}
}

36. Valid Sudoku

下面是dicuss里面的两个解答,感觉还不错:

one:

public boolean isValidSudoku(char[][] board) {
    for(int i = 0; i<9; i++){
        HashSet<Character> rows = new HashSet<Character>();
        HashSet<Character> columns = new HashSet<Character>();
        HashSet<Character> cube = new HashSet<Character>();
        for (int j = 0; j < 9;j++){
            if(board[i][j]!='.' && !rows.add(board[i][j]))
                return false;
            if(board[j][i]!='.' && !columns.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;
        }
    }
    return true;
}

two:

public boolean isValidSudoku(char[][] board) {
        Set<String> set = new HashSet<>();
        
        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[row].length; col++) {
                char val = board[row][col];
                if (val != '.') {
                    int block = (row / 3 * 3) + (col / 3);
                    if (set.contains("r" + row + val) || 
                        set.contains("c" + col + val) ||
                        set.contains("b" + block + val))
                        return false;
                    else {
                        set.add("r" + row + val);
                        set.add("c" + col + val);
                        set.add("b" + block + val);
                    }   
                }
            }
        }
        
        return true;
    }