LeetCode - Hard - 51

  • Backstracking

Description


https://leetcode.com/problems/n-queens/

The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens’ placement, where 'Q'and '.' both indicate a queen and an empty space, respectively.

Example 1:

Input: n = 4

Output: [[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]

Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above

Example 2:

Input: n = 1

Output: [[“Q”]]

Constraints:

  • 1 <= n <= 9

Analysis


题目分析

n皇后问题是回溯算法解决的经典问题。

首先来看一下皇后们的约束条件:

  1. 不能同行

  2. 不能同列

  3. 不能同斜线

确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。

下面用一个3 * 3 的棋牌,将搜索过程抽象为一颗树,如图:

注意,为了方便理解,暂时屏蔽皇后们“不能同斜线”的约束条件

从图可看出,二维矩阵中矩阵的高就是这颗树的高度,矩阵的宽就是树型结构中每一个节点的宽度(有多少个子节点)。

那么我们用皇后们的约束条件,来回溯搜索这颗树,只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了。

回溯三弄

根据经典回溯模板编程:

void backtracking(参数) {

if (终止条件) {

存放结果;

return;

}

for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {

处理节点;

backtracking(路径,选择列表); // 递归

回溯,撤销处理结果

}

}

函数签名
  • List<String> rows:当前遍历行前的皇后摆法。

  • int lengthOfSide:棋盘单边有多少格,也就是N皇后的N。

  • int depth:目前递归深度,它的最大值是lengthOfSide

  • List<List<String>> result:存放符合要求N皇后摆法。

代码如下:

private void backstracking(List rows, int lengthOfSide, int depth, List<List> result) {

}

终止条件

回看题目分析的例图,当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了。

代码如下:

if (rows.size() == lengthOfSide) {

result.add(new ArrayList<>(rows));

return;

}

遍历过程

首先,验证皇后摆法是否合法,皇后们不能同行,同列,同斜线,代码如下:

private boolean isValid(List rows, int row, int col, int lengthOfSide) {

// 上方向

for (int i = row - 1; i > -1; i–) {

if (rows.get(i).charAt(col) == ‘Q’)

return false;

}

// 左上斜线方向

for (int i = row - 1, j = col - 1; i > -1 && j > -1; i–, j–) {

if (rows.get(i).charAt(j) == ‘Q’)

return false;

}

// 右上斜线方向

for (int i = row - 1, j = col + 1; i > -1 && j < lengthOfSide; i–, j++) {

if (rows.get(i).charAt(j) == ‘Q’)

return false;

}

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-hKQ1mqQS-1711395908604)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值