zoukankan      html  css  js  c++  java
  • 52. N-Queens II

    题目:

    Follow up for N-Queens problem.

    Now, instead outputting board configurations, return the total number of distinct solutions.

    Show Tags
    Show Similar Problems
     

    链接: http://leetcode.com/problems/n-queens-ii/

    题解:

    刚昨晚NQueens I, 这换个问题又算一题...不过省了我们很多事。只需要设一个global的count来记录找到解的数目。

    Time Complexity - O(nn), Space Complexity - O(n)

    public class Solution {
        private int count = 0;
        
        public int totalNQueens(int n) {
            if(n <= 0)
                return count;
            int[] queens = new int[n];      // queens must be a permutation of n
            trySolveNQueens(queens, 0);
            return count;
        }
    
        private void trySolveNQueens(int[] queens, int pos) {
            int len = queens.length;
            if(pos == len)
                count++;
            else {
                for(int i = 0; i < len; i++) {
                    queens[pos] = i;
                    if(isBoardValid(queens, pos))
                        trySolveNQueens(queens, pos + 1);
                }
            }
        }
        
        private boolean isBoardValid(int[] queens, int pos) {
            for(int i = 0; i < pos; i++) {
                if(queens[i] == queens[pos])        // column conflicts
                    return false;
                else if(Math.abs(queens[pos] - queens[i]) == Math.abs(i - pos))  // diagonal conflicts
                    return false;
            }
            
            return true;
        }
    }

    二刷:

    Java:

    上一题的简化版本,只需要求有多少种solution就可以了。以后再了解一下NQueens的fancy做法

    Time Complexity - O(nn), Space Complexity - O(n)

    public class Solution {
        private int totalQueens = 0;
        public int totalNQueens(int n) {
            if (n <= 0) {
                return 0;
            }
            int[] queens = new int[n];
            trySolveNQueens(queens, 0);
            return totalQueens;
        }
        
        private void trySolveNQueens(int[] queens, int pos) {
            if (pos == queens.length) {
                totalQueens++;
            } else {
                for (int i = 0; i < queens.length; i++) {
                    queens[pos] = i;
                    if (isBoardValid(queens, pos)) {
                        trySolveNQueens(queens, pos + 1);
                    }
                }
            }
        }
        
        private boolean isBoardValid(int[] queens, int pos) {
            for (int i = 0; i < pos; i++) {
                if (queens[i] == queens[pos]) {
                    return false;
                }
                if (Math.abs(queens[i] - queens[pos]) == Math.abs(i - pos)) {
                    return false;
                }
            }
            return true;
        }
    }

    Reference:

  • 相关阅读:
    Java的基本数据类型及其封装类
    牛客寒假3-A |dp走格子
    牛客寒假1-I nico和niconiconi| 字符串 线性dp
    牛客寒假2-C算概率| 概率dp
    牛客寒假6-B重排列| dp计数
    牛客寒假6-B图| 统计环中结点个数,计算最大链长
    三分法 求最大值最小|牛客寒假5-B牛牛战队的比赛地
    P3382|三分法模板
    思维题(取模)| CF#615Div3 D.MEX maximizing
    树的直径| CF#615Div3 F. Three Paths on a Tree
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4436364.html
Copyright © 2011-2022 走看看