LeetCode - #51 N 皇后

简介: 不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

前言

我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。

LeetCode 算法到目前我们已经更新了 50 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

难度水平:困难

1. 描述

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

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

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

2. 示例

示例 1

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

示例 2

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

约束条件:

  • 1 <= n <= 9

3. 答案

class NQueens {
   
   
    func solveNQueens(_ n: Int) -> [[String]] {
   
   
        guard n > 0 else {
   
   
            return [[String]]()
        }

        var boards = [[String]]()
        var board = Array(repeating: "", count: n)

        dfs(&boards, &board, n, 0)

        return boards
    }

    private func dfs(_ boards: inout [[String]], _ board: inout [String], _ n: Int, _ row: Int) {
   
   
        if row == n {
   
   
            boards.append(Array(board))
            return
        }


        for col in 0..<n {
   
   
            if isValid(board, col, row) {
   
   
                board[row] = setRow(col, n)
                dfs(&boards, &board, n, row + 1)
            }
        }
    }

    private func isValid(_ board: [String], _ col: Int, _ row: Int) -> Bool {
   
   
        var c = -1

        for i in 0..<row {
   
   
            for j in 0..<board[0].characters.count {
   
   
                if charAt(board[i], j) == "Q" {
   
   
                    c = j
                    break
                }
            }

            // check col
            if c == col {
   
   
                return false
            }

            // check diagnol
            if abs(c - col) == abs(i - row) {
   
   
                return false
            }
        }

        return true
    }

    private func charAt(_ str: String, _ index: Int) -> Character {
   
   
        return str[str.index(str.startIndex, offsetBy: index)]
    }

    private func setRow(_ col: Int, _ n: Int) -> String {
   
   
        var row = ""

        for i in 0..<n {
   
   
            if i == col {
   
   
                row.append("Q")
            } else {
   
   
                row.append(".")
            }
        }

        return row
    }
}
  • 主要思想:经典的深度优先搜索,逐行填写,并每次检查列和诊断。
  • 时间复杂度: O(n^n)
  • 空间复杂度: O(n^2)

该算法题解的仓库:LeetCode-Swift

点击前往 LeetCode 练习

关于我们

我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。

后续还会翻译大量资料到我们公众号,有感兴趣的朋友,可以加入我们。

相关文章
|
11月前
|
Java 应用服务中间件 nginx
阿里巴巴架构实战:SpringBoot+SpringCloud+Docker+Nginx+分布式
在过去的几年时间里,最让人兴奋、回头率最高、最能改变游戏规则的东西,大概就是Spring Boot了。Spring Boot提供了一种新的编程范式,能在最小的阻力下开发Spring应用程序。有了它, 你可以更加敏捷地开发Spring应用程序,专注于应用程序的功能,不用在Spring的配置上多花功 夫,甚至完全不用配置。
BAT中for循环如何执行多条命令
BAT中for循环如何执行多条命令
551 0
|
机器人 项目管理 新零售
8年前诞生于淘宝,细数阿里云RPA 的前世今生!
阿里云RPA,在集团内部历经8年的验证,已经覆盖了阿里巴巴大部分BU,普遍赋能集团内部,如天猫、淘宝、蚂蚁金服、菜鸟、CCO、飞猪、阿里通信等。
3445 0
8年前诞生于淘宝,细数阿里云RPA 的前世今生!
|
JSON JavaScript 数据可视化
D3 不到20行代码就能实现世界地图的绘制
每到农历年末,相信很多小伙伴和本作者一样,都忍不住会去看江苏卫视的一档脑力比拼节目《最强大脑》,尽管上一季最强大脑喷点确实很多,但依旧没有减弱"追剧"的热情。今年最强大脑(第5季)的赛制有很大的变化,挑战的人数从百人大战,到最强30脑,再到现从第三场的一对一PK,确实与以往有了很大的不同。此外,今年更加强调了选手在生活中的光环,例如本文要引用的一场比赛就是最近一期来自清华的孙勇与北京的陈泽坤的一场以地图投影为背景的比赛,孙勇就是顶着2016安徽省高考理科状元的光环来的。今年没了叨叨魏,节目的流程显得自然了很多。好了,不扯了,来、来、来来来!我们开始说本文要讲的主题--地图。
1551 0
D3 不到20行代码就能实现世界地图的绘制
盛夏光年 - 江湖一剑客
何当共剪西窗烛,看巴山上,呦呦鹿鸣。 却话巴山夜雨时,盼君归期,食野之苹。 青青子衿风中飘扬, 悠悠我心雨中凄凉。 但为君故沧海荒, 沉吟至今变田桑。 曾经沧海难为水,沧海月明珠有泪,泪雨零铃终不怨。
1425 0
|
11月前
|
程序员 Android开发 Java
android开发基础机构,真的太香了
android开发基础机构,真的太香了
带你读《阿里云卓越架构白皮书》——2、设计原则
带你读《阿里云卓越架构白皮书》——2、设计原则
331 0
|
5天前
|
弹性计算 运维 自动驾驶
首个云超算国标正式发布!
近日,我国首个云超算国家标准GB/T 45400-2025正式发布,将于今年10月实施。该标准由阿里云联合多家机构起草,为云超算在高性能计算领域的应用提供规范。云超算结合传统HPC与云计算优势,解决传统HPC复杂、昂贵等问题。阿里云E-HPC V2.0是国内首批通过该标准认证的产品,支持大规模弹性计算,显著降低成本。新标准将推动算力基础设施迈向标准化、智能化新时代。
|
6天前
|
传感器 自然语言处理 监控
快速部署实现Bolt.diy
Bolt.diy 是 Bolt.new 的开源版本,提供灵活的自然语言交互与全栈开发支持。基于阿里云函数计算 FC 和百炼模型服务,最快5分钟完成部署。新手注册阿里云账号后可领取免费额度,按指引开通相关服务并授权。通过项目模板一键部署,配置 API-KEY 后即可使用。Bolt.diy 支持多种场景,如物联网原型开发、久坐提醒、语音控制灯光等,助力快速实现创意应用。
2244 19
|
7天前
|
云安全 人工智能 安全