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 条评论
登录 后参与评论

相关文章

来自专栏Java面试通关手册

这几道Java集合框架面试题在面试中几乎必问

本文会同步更新在我开源的Java学习指南仓库 Java-Guide (一份涵盖大部分Java程序员所需要掌握的核心知识,正在一步一步慢慢完善,期待您的参与)中,...

1172
来自专栏张善友的专栏

在Entity Framework 中执行T-sql语句

从Entity Framework  4开始在ObjectContext对象上提供了2个方法可以直接执行SQL语句:ExecuteStoreQuery<T> 和...

22710
来自专栏小灰灰

JDK容器学习之TreeMap (二) : 使用说明

TreeMap 使用说明 TreeMap 的底层数据结构为红黑树,主要是根据key进行排序,相比较于HashMap的数组+链表+红黑树的数据结构而言,两者的应...

2716
来自专栏WindCoder

Java漫谈-容器

除并发应用,Queue在Java SE5中仅有两个实现 LinkedList和PriorityQueue,差异在于排序行为,而不是性能。

861
来自专栏偏前端工程师的驿站

PLT:说说Evaluation strategy

Brief                                 在学习方法/函数时,我们总会接触到 按值传值 和 引用传值 两个概念。像C#是按值传...

2106
来自专栏小灰灰

ForkJoin 学习使用笔记

ForkJoin 学习使用笔记 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结...

29810
来自专栏Linux驱动

16.QT-QMap和QHash解析

3772
来自专栏岑玉海

hbase源码系列(五)Trie单词查找树

  在上一章中提到了编码压缩,讲了一个简单的DataBlockEncoding.PREFIX算法,它用的是前序编码压缩的算法,它搜索到时候,是全扫描的方式搜索的...

3878
来自专栏分布式系统和大数据处理

C#中的委托和事件 - Part.1

文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在V...

1183
来自专栏LanceToBigData

JavaWeb之DBUtils

一、什么是DBUtils及作用   DBUtils是apache公司写的。DBUtils是java编程中的数据库操作实用工具,小巧简单实用。   DBUtils...

2385

扫码关注云+社区

领取腾讯云代金券