题目:
思路:
①有效数独:9行9列9个3*3宫中数字不重复
②利用哈希映射存储每行每列每宫格,key为数字,value为出现个数,当value>1时,无效
③遍历行与列容易,遍历宫格时,索引index = (i/3)*3 + j/3
代码:
class Solution {
public boolean isValidSudoku(char[][] board) {
HashMap<Character,Integer>[] rows = new HashMap[9];//泛型擦除
HashMap<Character,Integer>[] columns = new HashMap[9];
HashMap<Character,Integer>[] boxs = new HashMap[9];
for(int i = 0; i < 9;i++){
rows[i] = new HashMap<Character,Integer>();
columns[i] = new HashMap<Character,Integer>();
boxs[i] = new HashMap<Character,Integer>();
}
for(int i = 0; i < 9; i++){//行
for(int j = 0; j < 9;j++){//列
char key = board[i][j];
if(key != '.'){
rows[i].put(key,rows[i].getOrDefault(key,0)+1);
columns[j].put(key,columns[j].getOrDefault(key,0)+1);
boxs[(i/3)*3 + j/3].put(key,boxs[(i/3)*3 + j/3].getOrDefault(key,0)+1);
if(rows[i].get(key) > 1 || columns[j].get(key) > 1 || boxs[(i/3)*3 + j/3].get(key) > 1)
return false;
}
}
}
return true;
}
}
复杂度分析:
空间复杂度:O(n) O(1)
时间复杂度:O(n*n) O(1) 因为9*9固定了
知识点:
①泛型擦除:
Java 泛型擦除是 Java 泛型中的一个重要特性,其目的是避免过多的创建类而造成的运行时的过度消耗。
这么声明泛型数组时,会报错error: generic array creation
HashMap<Character,Integer>[] rows = new HashMap<Character,Integer>[9];//泛型擦除
原因:错误在于启用了类型检查的编译器直接禁止创建泛型数组。
因为 Java 的泛型是基于擦除实现的,所以不管是 HashMap<Character,Integer>[]还是 HashMap<Character,Character>[],编译之后都是 HashMap[],编译器不能保证数组里面存的到底是 HashMap<Character,Integer> 还是 HashMap<Character,Character>,干脆直接禁止创建泛型数组。
所以要这么声明泛型”数组“:
HashMap<Character,Integer>[] rows = new HashMap[9];//泛型擦除
并且要加上这几句:(这里还没懂)
for(int i = 0; i < 9;i++){
rows[i] = new HashMap<Character,Integer>();
}
否则报错:
java.lang.NullPointerException
at line 16, Solution.isValidSudoku
at line 54, __DriverSolution__.__helper__
at line 84, __Driver__.main