一开始不明白为什么有这么一道几乎完全一样的,但把I的改一下超时了,所以要优化一下。经搜索,发现可以这样优化:使用col[i]表示第i行Q所在的列,那么,判断斜线是否满足就可以用abs(k-i)== abs(col[k]-j),注意这里k要小于i,因为后面的行没有放Q,而默认初始化时0列放Q,就会错误。
public class Solution { private int ans; private boolean[] visited; private int[] col; public int totalNQueens(int n) { ans = 0; col = new int[n]; visited = new boolean[n]; sub(0); return ans; } private void sub(int i) { int n = col.length; if (i == n) { ans++; } else { for (int j = 0; j < n; j++) { if (!visited[j] && isValid(i, j)) { col[i] = j; visited[j] = true; sub(i+1); visited[j] = false; } } } } private boolean isValid(int i, int j) { // only need to validate column and 'X' direction for (int k = 0; k < i; k++) { if (Math.abs(k-i)== Math.abs(col[k]-j)) return false; } return true; } }