leetcode52.N皇后II——学习笔记

题目:力扣icon-default.png?t=M0H8https://leetcode-cn.com/problems/n-queens-ii/

class Solution {
    public int totalNQueens(int n) {
        Set<Integer> diagonal1 = new HashSet<Integer>();
        Set<Integer> diagonal2 = new HashSet<Integer>();
        Set<Integer> columns = new HashSet<Integer>();
        int[] map = new int[n];
        Arrays.fill(map,-1);
        return putQueen(n,map,0,columns,diagonal1,diagonal2);
    }

    private int putQueen(int n,int[] map,int row,Set<Integer> columns,Set<Integer> diagonal1,Set<Integer> diagonal2){
        //出口
        if(row==n){
            return 1;
        }else{
            int count = 0;
            //判断
            for(int i=0;i<n;i++){
                if(columns.contains(i)){
                    continue;
                }
                int dia1 = row-i;
                if(diagonal1.contains(dia1)){
                    continue;
                }
                int dia2 = row+i;
                if(diagonal2.contains(dia2)){
                    continue;
                }
                //记录
                map[row] = i;
                columns.add(i);
                diagonal1.add(dia1);
                diagonal2.add(dia2);
                count += putQueen(n,map,row+1,columns,diagonal1,diagonal2);
                //状态重置
                map[row] = -1;
                columns.remove(i);
                diagonal1.remove(dia1);
                diagonal2.remove(dia2);
            }
            return count;
        }
    }
}

 

 思路:这题与leetcode51.N皇后大同小异,过程是完全一样的,只是leetcode51要求按照规定格式输出,本题只需要输出解的个数。因此,相比于leetcode51.N皇后本题还是简单一些。因此在此不再赘述解题步骤,详情请见leetcode51.N皇后

1.声明递归方法中需要用到的变量。因为本题不需要按照复杂的格式返回,仅仅需要返回解的数量,所以可以观察到相比于leetcode51少了ans变量。

Set<Integer> diagonal1 = new HashSet<Integer>();
Set<Integer> diagonal2 = new HashSet<Integer>();
Set<Integer> columns = new HashSet<Integer>();
int[] map = new int[n];
Arrays.fill(map,-1);

 2.递归方法putQueen修改如下。入参中不需要ans变量,递归出口修改,增加count变量记录解的个数,最后返回count即可。

    private int putQueen(int n,int[] map,int row,Set<Integer> columns,Set<Integer> diagonal1,Set<Integer> diagonal2){
        //出口
        if(row==n){
            return 1;
        }else{
            int count = 0;
            //判断
            for(int i=0;i<n;i++){
                if(columns.contains(i)){
                    continue;
                }
                int dia1 = row-i;
                if(diagonal1.contains(dia1)){
                    continue;
                }
                int dia2 = row+i;
                if(diagonal2.contains(dia2)){
                    continue;
                }
                //记录
                map[row] = i;
                columns.add(i);
                diagonal1.add(dia1);
                diagonal2.add(dia2);
                count += putQueen(n,map,row+1,columns,diagonal1,diagonal2);
                //状态重置
                map[row] = -1;
                columns.remove(i);
                diagonal1.remove(dia1);
                diagonal2.remove(dia2);
            }
            return count;
        }
    }

3.在主方法中调用并返回。

return putQueen(n,map,0,columns,diagonal1,diagonal2);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hokachi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值