10 有效的数独-20200321

题目

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例

输入:
[["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]
]
输出: true

说明

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 给定数独序列只包含数字 1-9 和字符 '.' 。
  • 给定数独永远是 9x9 形式的。

注意事项

  1. 数独的形式永远都是9x9。
  2. 空格用字符 '.'来代替了。
  3. 每个3x3的数组有5个数字,所以1-9每个数字都要出现5次。也就是说每个数字的重复次数等于5。 不对!!

思路一

用四个指针i,j,k,h做。三个判断设置用和三个字典single、row和column实现。数组来存储各个3*3的元素是否存在的指示。字典用来判断每行每列的重复元素。

  1. 判断字典single[nums[i,j]]是否为1,同时判断字典row[nums[i,j]]的数组中是否有i,字典colum[nums[i,j]的数组中是否有j。如果有一项不成立就返回False。否则字典存入相应项,并j加一。j在range(h,h+3)。
  2. 判断j是否等于2,5,8。如果等于就重置字典single,h+=3,否则pass。
  3. i循环range(k,k+3),循环完毕就k+=3。

修改经历:

1. 在判断时,把元素当做行列的index了。(第一次提交)

  • 解答错误

2. 修改过后,提交成功。(第二次提交)

  • 执行用时 :48 ms, 在所有 Python3 提交中击败了92.28%的用户
  • 内存消耗 :13.6 MB, 在所有 Python3 提交中击败了5.03%的用户

心得体会:

  1. 注意 i = j = 0 和 i, j =0, 0的区别,前者相当于两个指针指向一个地址,后者是两个指针指向两个地址。同理列表,字典等都是一样的。
  2. 还有 list 和 narray 的区别,前者是[i][j]取元素,后者是[i,j]取元素。
  3. 这个思路真的是很垃圾,其实这不是列表呢,直接取出来每行每列判断就好,难点就在怎么判断3*3的矩阵。
  4. 字典可以这么写 
    rows = [{} for i in range(9)]

最终代码展示:

class Solution:def isValidSudoku(self, board: List[List[str]]) -> bool:i, j, k, h = 0, 0, 0, 0single = {0:[], 1:[], 2:[], 3:[], 4:[], 5:[], 6:[], 7:[], 8:[], 9:[]}row = {0:[], 1:[], 2:[], 3:[], 4:[], 5:[], 6:[], 7:[], 8:[], 9:[]}column = {0:[], 1:[], 2:[], 3:[], 4:[], 5:[], 6:[], 7:[], 8:[], 9:[]}for k in range(0, 9, 3):for h in range(0, 9, 3):for i in range(k, k+3):for j in range(h, h+3):if board[i][j] != '.':item = int(board[i][j])if 1 not in single[item] and i not in row[item] and j not in column[item]:single[item] += [1]row[item] += [i]column[item] += [j]else:return Falseelse:passsingle = {0:[], 1:[], 2:[], 3:[], 4:[], 5:[], 6:[], 7:[], 8:[], 9:[]}return True

思路二

这次直接取出来判断。不要一个一个元素进行判断。比较难判断的就是每一小块怎么判断。找到每一块的index与循环次数的关系就好。n=[0,1,...,8],则Z形排列的小块的index为,横坐标=[3*int(n/3):3*int(n/3)+3],纵坐标=[3*int(n%3):3*int(n%3)+3]。

修改经历:

1. 写了半天,or写成and了。。。(第一次提交)

  • 解答错误

2. 修改过提交成功。(第二次提交)

  • 执行用时 :124 ms, 在所有 Python3 提交中击败了23.89%的用户
  • 内存消耗 :13.6 MB, 在所有 Python3 提交中击败了5.03%的用户

心得体会:

  1. 一定要注意列表的切片与narray不同!!!A=[[1,2],[3,4]]要取出[1,3]要单独在每一个list里取相应index的值。A[:][0]与A[:][0]都是[1,2]。[x[0] for x in A]才行。
  2. 怎么还慢了呢?

最终代码展示:

class Solution:def isValidSudoku(self, board: List[List[str]]) -> bool:for n in range(1, 10):for k in range(0, 9):column = [x[k] for x in board]temp = [x[3*int(k%3):3*int(k%3)+3] for x in board[3*int(k/3):3*int(k/3)+3]]block = []for item in temp:block += itemif board[k][:].count(str(n)) > 1 or column.count(str(n)) > 1 or block.count(str(n)) > 1:return Falsereturn True

LeetCode 探索初级算法-数组:10 有效的数独-20200321相关推荐

  1. 力扣:探索初级算法——数组篇——有效的数独

    题目:有效的数独 代码(C语言) bool isValidSudoku(char** board, int boardSize, int* boardColSize){int row[9][10] = ...

  2. 【初级算法】10.有效的数独

    题目: 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可.数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线 ...

  3. leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现

    leetcode explore 初级算法第三题,旋转数组代码实现.原题链接: 题目分析 因为题目不是很长,这里把题目贴出来: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...

  4. [算法]力扣刷题-初级算法 - 数组(三)(数组篇完结) [两数之和] [有效的数独] [旋转图像]

    初级算法 - 数组篇完结: 初级算法 - 数组(一): https://blog.csdn.net/weixin_43854928/article/details/121315702 初级算法 - 数 ...

  5. LeetCode初级算法(数组)解答

    这里记录了LeetCode初级算法中数组的一些题目: 加一 本来想先转成整数,加1后再转回去:耽美想到测试的例子考虑到了这个方法的笨重,所以int类型超了最大范围65536,导致程序出错. class ...

  6. 【LeetCode】初级算法:数组

    题目可以在LeetCode查看 1. 从排序数组中删除重复项 用时:11ms class Solution {public int removeDuplicates(int[] nums) {int ...

  7. leetcode 初级算法 数组

    数组 从排序数组中删除重复项 买卖股票的最佳时机 旋转数组 存在重复 只出现一次的数字 两个数组的交集II 加1 移动0 两数之和 有效的数独 旋转图像 从排序数组中删除重复项 题目:传入一个int型 ...

  8. 探索初级算法学习笔记-快速排序法

    快速排序法学习笔记 #include<stdio.h>void swap(int *a,int *b) {int t;t=*a;*a=*b;*b=t; }void quickSort(in ...

  9. 初级算法题->有效的数独--弄清哈希表的本质

    文章目录 题目 解法一:三个二维数组实现 解法二:三个一维数组利用单个位存储实现 题目 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只 ...

最新文章

  1. 【转】WinForm窗体间数据交互的方法
  2. muduo:高效整型转换为字符串
  3. 链式存储mysql_链栈:栈的链式存储结构
  4. 5G时代的无线宽带新技术
  5. vscode java settings设置_vscode 搭建java环境
  6. PHP之路——Xdebug扩展
  7. windows内核驱动
  8. 汽车故障检测仪计算机教程,如何使用汽车故障诊断仪进行汽车维修
  9. 【游戏开发进阶】教你在Windows平台编译tolua runtime的各个平台库(Unity | 热更新 | tolua | 交叉编译)
  10. 硬盘服务器哪个好用吗,服务器用固态硬盘好还是机械硬盘好
  11. 新《劳动法》能要来“双薪”?
  12. 为什么用CDN给你网站加速?
  13. Space Cloud updated Crack
  14. 基本的Dos命令(命令行盘符切换)
  15. html中dt标签,html中dt标签的使用方法
  16. 2017-2018-1 20162316刘诚昊 实验一 线性结构
  17. 3DS MAX 2022下载及安装教程 3dmax软件下载安装
  18. 看懂领导的这三个想法,能让领导刮目相看
  19. 程序员的6.1礼物—Cozmo机器人!
  20. c语言消消看算法,论消去游戏中的数据结构与算法.doc

热门文章

  1. Android屏幕渲染
  2. Linux文件锁(Filelock)是什么,怎么用?
  3. 小学生获奖作品html,小学生优秀绘画作品图片展示
  4. 阿里云国际版云计算应用在企业领域的优势有哪些
  5. 共模干扰以及共模干扰消除方法
  6. 【行业云说直播间】-智慧能源 低碳未来正式上线
  7. idr寄存器、_STM32 GPIO寄存器 IDR ODR BSRR BRR
  8. 微信小程序:map组件标注callout与label简单用法
  9. 普元mobile与eos集成发布手册
  10. 以XML数据源为例的一个数据结构化方法