leetcode 36

感觉就是遍历。

保存好状态,就是各行各列还有各分区divide的情况

用数组做。

空间小时间大

  1. class Solution {
  2. public:
  3. bool isValidSudoku(vector<vector<char>>& board) {
  4. int row[9][9]={0},col[9][9]={0},div[9][9]={0};
  5. int temp=0,dnum;
  6. for(int i=0;i<9;i++){
  7. for(int j=0;j<9;j++){
  8. if(board[i][j]!='.'){
  9. temp=board[i][j]-'0'-1;
  10. row[i][temp]++;
  11. col[j][temp]++;
  12. dnum=(i/3)*3+j/3;
  13. div[dnum][temp]++;
  14. if(row[i][temp]==2||col[j][temp]==2||div[dnum][temp]==2)
  15. return false;
  16. }
  17. }
  18. }
  19. return true;
  20. }
  21. };

然后

学到了用unordered_set  unordersd_map加速。

空间大时间小

  1. class Solution {
  2. public:
  3. bool isValidSudoku(vector<vector<char>>& board) {
  4. vector<unordered_set<int>> row(9), col(9), block(9);
  5. for(int i = 0; i < 9; ++ i){
  6. for(int j = 0; j < 9; ++ j){
  7. int bindex = (i / 3)* 3 + j / 3;
  8. char cur = board[i][j];
  9. if(cur == '.') continue;
  10. if(row[i].count(cur) || col[j].count(cur) || block[bindex].count(cur)) return false;
  11. row[i].insert(cur);
  12. col[j].insert(cur);
  13. block[bindex].insert(cur);
  14. }
  15. }
  16. return true;
  17. }
  18. };

leetcode 37

做之前还百度了一下有没有解数独的技巧。。。  OxO

上一道题保存了行列块的状态,这里也可以保留,保留的不再是出现与否而是可用数字

回溯就完事了

  1. class Solution {
  2. public:
  3. vector<unordered_set<int>> row, col, block;
  4. void solveSudoku(vector<vector<char>>& board) {
  5. // 预处理,初始状态
  6. int t=0;
  7. unordered_set<int> tp={1,2,3,4,5,6,7,8,9};
  8. for(int i=0;i<9;i++)
  9. {row.push_back(tp);col.push_back(tp);block.push_back(tp);}
  10. for( int i = 0; i < 9; i++)
  11. for( int j = 0; j < 9; j++)
  12. if( board[i][j] != '.'){
  13. t = board[i][j] - '0';
  14. row[i].erase(t), col[j].erase(t), block[(i/3)*3 + j/3].erase(t);
  15. }
  16. int flag=0;
  17. dfs(board,0,flag);
  18. if(flag==0) //题目说明有唯一解,不会出现
  19. cout<<"wrong"<<endl;
  20. }
  21.  
  22. bool check(vector<vector<char>>& board,int i,int j,int num){
  23. if(row[i].find(num)!= row[i].end()&& col[j].find(num) != col[j].end()
  24. && block[(i/3)*3 + j/3].find(num) != block[(i/3)*3 + j/3].end())
  25. return true;
  26. return false;
  27. }
  28.  
  29. void dfs(vector<vector<char>>& board,int cnt,int &flag){
  30. if( cnt == 81){
  31. flag = 1;
  32. return ;
  33. }
  34. int i = cnt / 9, j = cnt % 9;
  35. if( board[i][j] == '.'){
  36. for( int k = 1; k < 10; k++)
  37. if(check(board, i, j, k)){
  38. row[i].erase(k), col[j].erase(k), block[(i/3)*3 + j/3].erase(k);
  39. board[i][j] = '0'+k;
  40. dfs(board, cnt+1,flag);
  41. if(flag)
  42. return;
  43. else{
  44. row[i].insert(k), col[j].insert( k), block[(i/3)*3 + j/3].insert(k);
  45. board[i][j] = '.';
  46. }
  47. }
  48. else
  49. continue;
  50. }
  51. else
  52. dfs(board, cnt+1,flag);
  53. return ;
  54. }
  55. };

然后效率很差。。时间和空间上

改成数组

  1. class Solution {
  2. public:
  3. int row[10][10], col[10][10], block[10][10];
  4. void solveSudoku(vector<vector<char>>& board) {
  5. // 预处理,初始状态
  6. int t=0;
  7. for( int i = 0; i < 9; i++)
  8. for( int j = 1; j < 10; j++)
  9. {
  10. row[i][j]=0, col[i][j]=0, block[i][j]=0;
  11. }
  12. for( int i = 0; i < 9; i++)
  13. for( int j = 0; j < 9; j++)
  14. if( board[i][j] != '.'){
  15. t = board[i][j] - '0';
  16. row[i][t]=1, col[j][t]=1, block[(i/3)*3 + j/3][t]=1;
  17. }
  18. int flag=0;
  19. dfs(board,0,flag);
  20. if(flag==0) //题目说明有唯一解,不会出现
  21. cout<<"wrong"<<endl;
  22. }
  23.  
  24. void dfs(vector<vector<char>>& board,int cnt,int &flag){
  25. if( cnt == 81){
  26. flag = 1;
  27. return ;
  28. }
  29. int i = cnt / 9, j = cnt % 9;
  30. if( board[i][j] == '.'){
  31. for( int k = 1; k < 10; k++)
  32. if(row[i][k]==0 && col[j][k]==0 && block[(i/3)*3 + j/3][k]==0){
  33. row[i][k]=1, col[j][k]=1, block[(i/3)*3 + j/3][k]=1;
  34. board[i][j] = '0'+k;
  35. dfs(board, cnt+1,flag);
  36. if(flag)
  37. return;
  38. else{
  39. row[i][k]=0, col[j][k]=0, block[(i/3)*3 + j/3][k]=0;
  40. board[i][j] = '.';
  41. }
  42. }
  43. else
  44. continue;
  45. }
  46. else
  47. dfs(board, cnt+1,flag);
  48. return ;
  49. }
  50. };

我好了

然后,不传引用而是copy可以再节省一点空间

然后剪枝,没考虑 OxO

leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独的更多相关文章

  1. Leetcode之回溯法专题-37. 解数独(Sudoku Solver)

    Leetcode之回溯法专题-37. 解数独(Sudoku Solver) 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1 ...

  2. Java实现 LeetCode 37 解数独

    37. 解数独 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实 ...

  3. [leetcode] 37. 解数独(Java)(dfs,递归,回溯)

    37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...

  4. [LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针

    一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of ...

  5. [LeetCode] Fraction to Recurring Decimal 哈希表

    Given two integers representing the numerator and denominator of a fraction, return the fraction in ...

  6. leetcode刷题-37解数独

    题目 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔的 3x ...

  7. C++ 哈希表 (hashtable) 用于保存简单的数据,及数据查找,数据删除

    /*hashtable.h*/ #include<iostream> #include <string> #include<vector> using namesp ...

  8. Leetcode——37.解数独 [##]

    @author: ZZQ @software: PyCharm @file: leetcode37_solveSudoku.py @time: 2018/11/20 16:41 思路:递归回溯 首先, ...

  9. C#LeetCode刷题-哈希表

    哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串   24.2% 中等 18 四数之和   ...

随机推荐

  1. [工作札记]03: 微软Winform窗体中ListView、DataGridView等控件的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有

    工作中,我们发现了微软.net WinForm的一个Bug,会导致窗体设计器自动生成的代码失效,这个Bug从.net4.5到最新的.net4.7.2都存在,一直没有解决.最初是我在教学工作中发现的,后 ...

  2. 容器编排系统K8s之包管理器helm基础使用(二)

    前文我们介绍了helm的相关术语和使用helm安装和卸载应用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14305902.html:今天我们来介绍下自定义 ...

  3. Zabbix监控虚拟机服务-告警与自动恢复

    今天稍微空闲,使用下zabbix的5.0版本,目前生产环境是4.x版本 今天就只实现一个目的:监控任意一个服务(示例中监控的是docker.service),如果服务挂了,自动给恢复,先看一个动图 搭 ...

  4. LTH7锂电池充放电IC完整方案

    内容目录: A,LTH7贴片5脚充电芯片    PW4054 1, 单节的锂电池保护电路     单节为3.7V锂电池(也叫4.2V)和3.8V锂电池(也叫4.35V) 2, 单节的锂电池充电电路   ...

  5. LocalDateTime、OffsetDateTime、ZonedDateTime互转,这一篇绝对喂饱你

    前言 你好,我是A哥(YourBatman). 在JSR 310日期时间体系了,一共有三个API可用于表示日期时间: LocalDateTime:本地日期时间 OffsetDateTime:带偏移量的 ...

  6. git的使用学习笔记---分支删除

    一.使用场景: 1.修改bug,原来分支不管用 2,分支太多不易管理 二.方法 git branch -d branch1 无法删除:原因在与该分支为目前工作的分支,所以要切换分支 git check ...

  7. GraphQL 在酒店系统上的实践

    https://mp.weixin.qq.com/s/Pmut13GYP-kwR2xm8fH-7Q

  8. python RecursionError: maximum recursion depth exceeded while calling

    import copyimport sys # 导入sys模块sys.setrecursionlimit(8192) # 将默认的递归深度修改为r = sys.getrecursionlimit()_ ...

  9. cnpm安装依赖时报Error: Cannot find module 'core-js/modules/es6.regexp.constructor'

    解决方案:npm install core-js@2 大致猜测:cnpm掉包所致...

  10. Java——时间和日期处理

    Date Date date = new Date(); 获取时间 Date d = new Date(); // Date d2=new Date(System.currentTimeMillis( ...