题目地址:
https://leetcode.com/problems/n-queens-ii/
经典N皇后问题。DFS回溯+剪枝。代码如下:
public class Solution {
int count = 0;
public int totalNQueens(int n) {
if (n == 0) {
return 0;
}
int[] pos = new int[n];
dfs(pos, 0);
return count;
}
private void dfs(int[] pos, int k) {
if (k == pos.length) {
count++;
}
for (int i = 0; i < pos.length; i++) {
if (check(pos, k, i)) {
pos[k] = i;
dfs(pos, k + 1);
}
}
}
// 尝试在第k行的第i个位置放皇后
private boolean check(int[] pos, int k, int i) {
for (int dif = 1; dif <= k; dif++) {
if (i - dif >= 0 && pos[k - dif] == i - dif) {
return false;
}
if (i + dif < pos.length && pos[k - dif] == i + dif) {
return false;
}
if (pos[k - dif] == i) {
return false;
}
}
return true;
}
}
时间复杂度 ,相当于生成全排列。剪枝后实际上时间复杂度要比生成全排列小很多。这里直接取上界了。空间 。