一开始不明白为什么有这么一道几乎完全一样的,但把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;
}
}