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多线程系列四】控制线程执行顺序
    【Java多线程系列随笔二】BlockingQueue
    【Java多线程系列三】实现线程同步的方法
    【Java多线程系列随笔一】浅析 Java Thread.join()
    【Java多线程系列二】Thread类的方法
    【Java多线程系列一】Java实现线程方法
    如何优雅的使用和理解线程池
    spring 中 isolation 和 propagation 详解
    嵊州普及Day6T1
    嵊州普及Day5T4
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4436364.html
Copyright © 2011-2022 走看看