这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
推荐阅读
大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
一、题目
1、算法题目
“给定一个整数n,返回所有不同的N皇后问题的解决方案。”
题目链接:
来源:力扣(LeetCode)
链接:51. N 皇后 - 力扣(LeetCode) (leetcode-cn.com)
2、题目描述
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
1 | css复制代码示例 1: |
1 | lua复制代码示例 2: |
二、解题
1、思路分析
N皇后问题是一道经典的回溯问题。首先,分析规则,N皇后放置在N*N 棋盘上,然后皇后彼此之间不能相互攻击。
直接的做法是暴力枚举所以可能的情况,然后判断互相不攻击的情况,但是暴力枚举的时间复杂度非常高,必须利用限制条件进行优化。
可以通过回溯的方法找到可能的解,首先,使用一个数组记录每个每行皇后的列下标,依次在每一行放置一个皇后后,下一个放置皇后的位置都不能和已经放置皇后的位置之间有攻击,当所有皇后放置完毕,就可以找到一个解。
为了降低总时间复杂度,需要在放置皇后时快速判断每个位置是否可以放置皇后,那么就可以在O(1)的时间内判断该位置的列和两条斜线上是否已经有皇后。
2、代码实现
代码参考:
1 | csharp复制代码public class Solution { |
3、时间复杂度
时间复杂度 : O(N!)
其中N是皇后数量。
空间复杂度: O(N)
其中N是皇后数量。
三、总结
这道题可以好好理解一下。
爱奇艺和字节的笔试都出现过这道题。
本文转载自: 掘金