52. N-Queens II
= =这个题好像跟另一个N-QUEEN一样的。。
我还以为distinct要转棋盘呢。。比如某种解旋转期盼180°和另一种一样,就要去掉。。结果发现根本不是,就是算总数,比上一个少了个构建LIST的步骤。
public class Solution
{
int res = 0;
public int totalNQueens(int n)
{
int[] dp = new int[n];
helper(dp,n,0);
return res;
}
public void helper(int[] dp, int n, int row)
{
if(n == row) res++;
else
{
for(int i = 0; i < n;i++)
{
dp[row] = i;
if(isFine(dp,row)) helper(dp,n,row+1);
}
}
}
public boolean isFine(int[] dp, int atWhere)
{
for(int i = 0; i < atWhere;i++)
{
if(dp[i] == dp[atWhere] || Math.abs(i-atWhere) == Math.abs(dp[i] - dp[atWhere])) return false;
}
return true;
}
}
二刷。还是三刷的。
一样。。一维DP作为CHECK,然后DFS+BACKTRACK
Time: O(n^n)
Space: O(n)
public class Solution {
int res = 0;
public int totalNQueens(int n) {
if (n == 0) return 0;
int[] row = new int[n];
dfs(row, 0);
return res;
}
public void dfs(int[] row, int m) {
if (m == row.length) {
res++;
} else {
for (int i = 0; i < row.length; i++) {
row[m] = i;
if (isValid(row, m)) {
dfs(row, m + 1);
}
}
}
}
public boolean isValid(int[] row, int m) {
for (int i = 0; i < m; i++) {
if (row[m] == row[i]) return false;
if (Math.abs(m - i) == Math.abs(row[m] - row[i])) return false;
}
return true;
}
}

浙公网安备 33010602011771号