最近看了一两篇关于leetcode刷题的总结,大体意思就是尽量不要使用ide(lll¬ω¬)然后默写代码保证bug free,这tm就让人很蒙蔽了,lz一直是用visual studio ,有时候程序跑崩了还用用单步调试,看来以后要改变自己的编程习惯了,是有些过分依赖ide了。以后每道题都尽量写一篇随笔把,谈谈对这题的感受,以后没准复习还能用得上。lz最近是电脑进水,项目就暂时不写了才有时间来刷leetcode,以后电脑修好之后也保证每日一题吧。

这次的题目是-->数独是否是合法的

不用管是否有解,就看已知的这堆数是否合法就行,也就是保证每一行一列一个3*3的小格里面不能有重复即可。

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

A partially filled sudoku which is valid.

Note:

A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

空的地方是 . (点)

大概思路就是申请9*3=27个hash表 unordered_map  然后往里面塞数,如果出现重复就return false

发现速度挺慢的,就改成了申请3个 int [9][9] ,初值为0,如果有数就+1,比上面快了一点点。

class Solution {
public:bool isValidSudoku(vector<vector<char>>& board) {int mi[9][9] = { 0 }, mj[9][9] = { 0 }, mg[9][9] = { 0 };for (int i = 0; i < 9; i++){for (int j = 0; j < 9; j++){if (board[i][j] != '.'){int index = board[i][j] - '0'-1;if (mi[i][index] == 0 && mj[j][index] == 0 && mg[i / 3 * 3 + j / 3][index] == 0){mi[i][index] = 1;mj[j][index] = 1;mg[i / 3 * 3 + j / 3][index] = 1;}else return false;}}}return true;}
};

runtime 22ms

之前用hash是33ms

用时27min做完这题

第二道题是解数独,这次可坑死了,做了足足90min,主要是没想到会这么复杂,一开始就想的很简单,就以为可以填数的空位总会存在一个唯一解,然后解了这个又会出现别的唯一解,最后就能求了。然后花了一个小时写完发现程序出现死循环了,但我坚持没有用debug,靠眼睛调试觉得出现了不是唯一解的情况,果然自己亲自解了一下数独发现确实如此。于是看了一下discuss,发现别人的解析是用的dfs....emmm,那就用dfs写了,然后做出来了。runtime是5ms,只有6个测试样例。

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

A sudoku puzzle...

...and its solution numbers marked in red.

class Solution {
public:void solveSudoku(vector<vector<char>>& board) {int mi[9][9] = { 0 }, mj[9][9] = { 0 }, mg[9][9] = { 0 };int count = 81;for (int i = 0; i < 9; i++){for (int j = 0; j < 9; j++){if (board[i][j] != '.'){int index = board[i][j] - '0'-1;mi[i][index] = 1;mj[j][index] = 1;mg[i / 3 * 3 + j / 3][index] = 1;count--;}}}  dfs(board, mi, mj, mg, 0, 0);}bool dfs(vector<vector<char>> &board, int mi[9][9],int mj[9][9],int mg[9][9],int i,int j){if (j == 9 && i == 8) return true;if (j == 9) {j = 0; i++;}if (board[i][j] != '.') return dfs(board, mi, mj, mg, i, j + 1);for (int p = 0; p < 9; p++){if (0 == mi[i][p] && 0 == mj[j][p] && 0 == mg[i / 3 * 3 + j / 3][p]){mi[i][p] = 1;mj[j][p] = 1;mg[i / 3 * 3 + j / 3][p] = 1;board[i][j] = p + '0' + 1;if (dfs(board, mi, mj, mg, i, j + 1))return true;else{mi[i][p] = 0;mj[j][p] = 0;mg[i / 3 * 3 + j / 3][p] = 0;board[i][j] = '.';}}} return false;}
};

前面的与第一题差不多还是记录每行、每列、每个3*3格子的可用数字的状态,后面就是对每个为'.'的格子进行三个表的取交集,然后dfs就行了。注意别忘记判断false的情况。

顺便贡献一个测试样例,省的再敲了

 char *b[9] = { "..9748...","7........",".2.1.9...","..7...24.",".64.1.59.",".98...3..","...8.3.2.","........6","...2759..", };vector<vector <char> >  matrix;vector<char> row;for (int i = 0; i < 9; i++) {row.clear();char *col = b[i];while (*col != '\0') {row.push_back(*col);col++;}matrix.push_back(row);}for (int i = 0; i < matrix.size(); i++) {vector<char> row = matrix[i];vector<char> ::iterator vi;for (vi = row.begin(); vi != row.end(); vi++) {cout << *vi;cout << ' ';}cout << endl;}

matrix这个参数即为数独矩阵

leetcode刷题随笔数独是否合法利用dfs求数独的解相关推荐

  1. python刷题用leet_GitHub - Yolymaker/leetcode-python: 利用python分类刷leetcode题目

    leetcode分类高效刷题 leetcode是一个很好的学习算法的一个online judge的网站,通过刷题能够快速提升自己的算法能力.但是令大家都头疼的就是,怎么能够高效的通过leetcode刷 ...

  2. LeetCode刷题——36.有效的数独

    文章目录 面试刷题第二天 LeetCode刷题--36.有效的数独 1.题目描述 2.解题思路(一) 3.解题思路(二) 面试刷题第二天 LeetCode刷题--36.有效的数独 1.题目描述 请你判 ...

  3. Leetcode-How-What 力扣Leetcode刷题指南

    Leetcode-How-What 力扣Leetcode刷题指南 About the way how to use Leetcode wisely for preparing the intervie ...

  4. 个人LeetCode刷题记录(带题目链接及解答)持续更新

    Leetcode 刷题 注:~[完成]代表还有一些方法没看,最后再看 一.一些需要重刷的典型题: 1.快速排序,归并排序,堆排序(递归的思想) 2.链表中的回文链表,其中的快慢指针,多看,多练 3.链 ...

  5. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

  6. LeetCode刷题记录4——67. Add Binary(easy)

    LeetCode刷题记录4--67. Add Binary(easy) 目录 LeetCode刷题记录4--67. Add Binary(easy) 题目 语言 思路 后记 题目 今天这题是与字符串相 ...

  7. Leetcode刷题第1题:两数之和(基于Java语言)

    ** Leetcode刷题第1题:两数之和(基于Java语言) ** 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标 ...

  8. Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言)

    Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言) 题目: 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元 ...

  9. Leetcode刷题 155题: 最小栈(基于python3和c++两种语言)

    ** Leetcode刷题 155题: 最小栈(基于python3和c++两种语言) ** ** 题目: ** 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. ...

最新文章

  1. VMware试验问题总结
  2. 如何查看keepalived版本号_Linux下Keepalived 安装与配置
  3. 通过分析一个C程序的汇编指令执行过程,理解计算机的工作。
  4. [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 单页应用 (With Router)
  5. Oracle使用imp/exp导入/导出数据库
  6. Leetcode--714. 买卖股票的最佳时间含手续费
  7. layui 传递前端请求_layui弹出层如何传值?
  8. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?
  9. 计算机代码如何求三角形面积,简单的程序来计算三角形的面积
  10. HTTP 1.1状态代码
  11. dbtool一bug跟踪记
  12. 总结开发Silverlight 注意事项
  13. ZT: Some lesser-known truths about programming
  14. 西威变频器avo下载调试资料_全程图解变频器应用与检测技能
  15. 修改注册表让PPC手机更加省电方法
  16. CISP 考试教材《第 10 章 知识域:软件开发安全》知识整理
  17. .net rdlc 自定义函数把数字转换为大写中文
  18. 华为RH2288H V3服务器更换内存条
  19. LT-mapper,LT-SLAM代码运行与学习
  20. 几个数字的组合方式种类个数

热门文章

  1. matlab摩托车刹车问题,摩托车刹车遇到锁死的情况,该怎么办?
  2. 上海黄牛缘何溢价收购公交卡
  3. 8年前端与众不同的Vue实战系列,助你成为前端顶级开发者
  4. Python的格式化输出方式
  5. SAP中统计生产线生产计划来辅助排产工作
  6. java反射机制date类型_java反射机制
  7. PHP开发APP接口全过程(一)
  8. PHP服务端开发APP接口
  9. Docker基本命令(二)之 容器卷使用、DockerFile
  10. corda_用Corda开发