【Leetcode】52. N-Queens II

题目地址:

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

时间复杂度 O ( n ! ) O(n!) ,相当于生成全排列。剪枝后实际上时间复杂度要比生成全排列小很多。这里直接取上界了。空间 O ( n ) O(n)

发布了103 篇原创文章 · 获赞 0 · 访问量 2603

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/104087117
今日推荐