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;
    }

}
posted @ 2025-06-25 22:19  vast_joy  阅读(12)  评论(0)    收藏  举报