「leetCode」51-N皇后⚡️

109 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

\

大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。 如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~

题目🦀

51. N 皇后

难度困难

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

示例 1:

img

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9

解题思路🌵

  • 有出路、有死路。
  • 考虑使用回溯算法。

解题步骤🌟

  • 经典回溯套路
//初始化result path
const result = []
const path = []
// [1,2,3,4]
//循环
push
backtrac()
pop
//return
  • 循环每一列是否能放置皇后
  • 如果不能,继续下一列
  • 如果可以,继续递归下一行查找
  • 如果递归到了底层表示是一种解决方案,path收集它

源码🔥

/**
 * @param {number} n
 * @return {string[][]}
 */
var solveNQueens = function(n) {
    const result = []
    const path = []

    function backtrack(row,path){
        //到了棋盘的底部的下一层 path刚好收集满了 [1,3,0,2]
        if(row===n){
             return result.push(
                path.map((item)=>{
                    const arr = new Array(n).fill('.')
                    arr[item]='Q'
                    return arr.join('')
                })
            )
        }

        for(let col=0;col<n;col++){
           function canNotSet(){
                return path.some((c,r)=>{
                    return (col===c) || (row===r) || (row-col===r-c) || (row+col===r+c)
             })
        }
         const result=canNotSet()
            //不能被设置
            if(result){
                continue
            }
            backtrack(row+1,[...path,col])
        }

    }

    backtrack(0,path)

    return result
};

时间复杂度:O(N!)

空间复杂度:O(N)

结束语🌞

那么鱼鱼的LeetCode算法篇的「leetCode」51-N皇后⚡️就结束了,虽然前端对算法要求没有后端高,但是算法是编程基础,程序=数据结构➕算法,所以算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾,欢迎加我好友,一起沙雕,一起进步

github🤖:sudongyu

个人博客👨‍💻:速冻鱼blog

vx👦:sudongyuer

写在最后

伙伴们,如果喜欢我的口水话给🐟🐟点一个赞👍或者关注➕都是对我最大的支持。