专栏首页韦弦的偶尔分享Swift 有效的数独 - LeetCode

Swift 有效的数独 - LeetCode

题目:两数之和

描述:

判断一个数独是否有效,根据:Sudoku Puzzles - The Rules(数独规则: 每一行不能有重复的数字;每一列不能有重复的数字;将数独框划分为三行三列,没9个小方格不能有重复;)

数独部分填了数字,空的部分用 '.' 表示。

image

一个部分填充是有效的数独。

说明: 一个有效的数独(填了一部分的)不一定是可解的,只要已经填的数字是有效的即可。

思路: 根据题意及数独的规则,只需要判断每一行的数字,每一列的数字和9宫格的数字有没有重复即可。可以用Set进行解题。board[i][j]表示行,board[j][i]表示列,当i 和 j 对 3 进行求余为0时,表示一个9宫格。

代码如下:

class Solution {
    //有效的数独
    func isValidSudoku(_ board: [[Character]]) -> Bool {
  
        var rowSet = Set<Character>()
        var colSet = Set<Character>()
        
        for i in 0..<9 {
            
            rowSet.removeAll()
            colSet.removeAll()
            
            for j in 0..<9 {
                
                if i % 3 == 0 && j % 3 == 0 {
                    
                    //检查块
                    if !checkBlock(board, row: i, col: j) {
                        return false
                    }
                
                }
                
                if board[i][j] != "." {
                    
                    //检查行
                    if rowSet.contains(board[i][j]) {
                        return false
                    }
                    rowSet.insert(board[i][j])
                }
                
                if board[j][i] != "." {
                    
                    //检查列
                    if colSet.contains(board[j][i]) {
                        return false
                    }
                    colSet.insert(board[j][I])
                }
            }
        }
        return true
    }
    
    //检查块是否有效
    private func checkBlock(_ board: [[Character]], row: Int, col: Int) -> Bool {
        var blockSet = Set<Character>()
        for i in row..<(row + 3) {
            for j in col..<(col + 3) {
                if board[i][j] != "." {
                    if blockSet.contains(board[i][j]) {
                        return false
                    }
                    blockSet.insert(board[i][j])
                }
            }
        }
        return true
    }
}
用Swift开始学习算法中,在LeetCode中开始做初级算法这一章节,将做的题目在此做个笔记吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SwiftUI:使用 URLSession 发送和接收 Codable 数据

    iOS为我们提供了从互联网发送和接收数据的内置工具,如果我们将其 Codable 持结合起来,那么就可以将 Swift 对象转换为 JSON 进行发送,然后将接...

    韦弦zhy
  • 微信小程序导航参数中含有问号

    和三一样,还可以使用 encodeURIComponent 和 decodeURIComponent 这就是小程序中导航的参数含有?的解决方案,如果还有其他好...

    韦弦zhy
  • Hacking with iOS: SwiftUI Edition - Moonshot 项目(二)

    当用户从我们的主列表中选择一个阿波罗任务时,我们希望显示有关该任务的信息:其图像,任务徽章以及机组人员中的所有宇航员及其角色。前两个并不太难,但是第二个需要更多...

    韦弦zhy
  • leetcode: 37. Sudoku Solver

    …and its solution numbers marked in red.

    JNingWei
  • python 实现 2048 游戏 (二)

    上一篇文章中,我们梳理了实现简易版 2048 游戏的基本知识,这篇文章将介绍如何实现各个模块。换句话说,上一次我们确定了旅行的目的地,这一次就让我们自由畅行在山...

    用户2870857
  • leetcode419. Battleships in a Board

    假设有一个2D板,在板上用X表示战舰,已知板上任意两个战舰体之间一定会用.隔开,因此不会出现两个X相邻的情况。现在要求用O(N)的时间复杂度和O(1)的空间复杂...

    眯眯眼的猫头鹰
  • leetcode: 79. Word Search

    JNingWei
  • LeetCode 999. 车的可用捕获量

    在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” ...

    Michael阿明
  • LeetCode 130. 被围绕的区域(图的BFS/DFS)

    解释: 任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或...

    Michael阿明
  • 用数学思维实现雷达分析图

    前段时间回看里约奥运会的国球比赛,岛国媒体给我龙队一个响亮的称号—— 六边形战士 !

    蜻蜓队长

扫码关注云+社区

领取腾讯云代金券