package com.david.leetcode;
import java.util.HashMap;
public class T36 {
class Solution {
/**
case1: 记住可以利用数组结合循环创建多个同类对象
利用的还是官方思路:
为每一行,每一列,每一个子3*3的数独分别建立一个HashMap<Integer,Integer>用于统计遍历到的数字的出现情况
特别注意子3*3数独的索引与行i,列j的关系为 索引=i/3*3+j/3;
char类型数字c如何转换陈对应的int型数值(利用ascii码);c-'0'/c - 48('0'对应的ascii码=48)
*/
HashMap<Integer,Integer>[] rows = new HashMap[9];
HashMap<Integer,Integer>[] cols = new HashMap[9];
HashMap<Integer,Integer>[] sds = new HashMap[9];
public boolean isValidSudoku(char[][] board) {
for(int i=0;i<9;i++){
rows[i] = new HashMap<Integer,Integer>();
cols[i] = new HashMap<Integer,Integer>();
sds[i] = new HashMap<Integer,Integer>();
}
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
char temp = board[i][j];
if(temp!='.'){
/*
这里不能先进行判断,套先加入后再判断(比如某一行或列或box中只有两个相同数字时,这时明显要return false;但是如果采用先判断在加入的方式则检测不出来这类情况,它会返回true)
*/
rows[i].put(temp-48,rows[i].getOrDefault(temp-48,0)+1);
cols[j].put(temp-48,cols[j].getOrDefault(temp-48,0)+1);
sds[(i/3)*3+j/3].put(temp-48,sds[(i/3)*3+j/3].getOrDefault(temp-48,0)+1);
if(rows[i].get(temp-48)>1||cols[j].get(temp-48)>1||sds[(i/3)*3+j/3].get(temp-48)>1) return false;
}
}
}
return true;
}
}
/**
* Case2:采用下面的思路:
为行,列,各子box各自创建一个9*9的boolean数组第0个下标用于表示第几个行/列/box,第1个下标用于记录0-9中各个数的出现情况
特别注意子3*3数独的索引与行i,列j的关系为 索引=i/3*3+j/3;
char类型数字c如何转换陈对应的int型数值(利用ascii码);c-'0'/c-48('0'对应的ascii码=48)
* */
class Solution2 {
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';
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;
}
}
}
leetcode T36
最新推荐文章于 2024-11-10 14:06:08 发布