2025.6.25学习
2025.6.25学习
这几天重新开一下八股和算法,准备9月份的秋招了
leetcode 51 N皇后
思路:深搜回溯,可以用集合来存不能填的元素优化时间复杂度
class Solution {
List<List<String>> ans = new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
//回溯
int[][] m = new int[n][n], used = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
used[i][j] = 0;
}
}
dfs(n, m, 0, used, new ArrayList<>());
return ans;
}
public void dfs(int n, int[][] m, int curNum, int[][] used, List<String> cur) {
if (curNum == n) {
ans.add(new ArrayList<>(cur));
//System.out.println(cur + " num:" + ans.size());
return;
}
for (int i = 0; i < n; i++) {
if (used[curNum][i] == 0) {
int[][] newUsed = transUsed(m, curNum, i, used);
String curS = new String();
for (int j = 0; j < n; j++) {
if (j == i)
curS += 'Q';
else
curS += '.';
}
cur.add(curS);
//System.out.println(curS+" curNum:"+curNum);
//System.out.println(cur);
dfs(n, m, curNum + 1, newUsed, cur);
cur.remove(curNum);
}
}
}
public int[][] transUsed(int[][] m, int a, int b, int[][] used) {
int len = m.length;
int[][] result = new int[len][len];
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
result[i][j] = used[i][j];
}
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (i == a || j == b || (i + j) == (a + b) || (i - j) == (a - b))
result[i][j] = 1;
}
}
return result;
}
}

浙公网安备 33010602011771号