[leetcode]N-Queens II

一开始不明白为什么有这么一道几乎完全一样的,但把I的改一下超时了,所以要优化一下。经搜索,发现可以这样优化:使用col[i]表示第i行Q所在的列,那么,判断斜线是否满足就可以用abs(k-i)== abs(col[k]-j),注意这里k要小于i,因为后面的行没有放Q,而默认初始化时0列放Q,就会错误。

public class Solution {

    private int ans;

    private boolean[] visited;

    private int[] col;

    public int totalNQueens(int n) {

        ans = 0;

        col = new int[n];

        visited = new boolean[n];

        sub(0);

        return ans;

    }

    

    private void sub(int i)

    {

        int n = col.length;

        if (i == n)

        {

            ans++;

        }

        else

        {

            for (int j = 0; j < n; j++)

            { 

                if (!visited[j] && isValid(i, j))

                {

                    col[i] = j;

                    visited[j] = true;

                    sub(i+1);

                    visited[j] = false;

                } 

            }

        }

    }

    

    private boolean isValid(int i, int j)

    {

        // only need to validate column and 'X' direction

        for (int k = 0; k < i; k++)

        {

            if (Math.abs(k-i)== Math.abs(col[k]-j)) return false;

        }

        return true;

    }

}

  

你可能感兴趣的:(LeetCode)