leetcode第37题

简介: 从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。

image.png给定一个数独棋盘,输出它的一个解。

解法一 回溯法

从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。

publicvoidsolveSudoku(char[][] board) {
solver(board);
}
privatebooleansolver(char[][] board) {
for (inti=0; i<9; i++) {
for (intj=0; j<9; j++) {
if (board[i][j] =='.') {
charcount='1';
while (count<='9') {
if (isValid(i, j, board, count)) {
board[i][j] =count;
if (solver(board)) {
returntrue;
                        } else {
//下一个位置没有数字,就还原,然后当前位置尝试新的数board[i][j] ='.';
                        }
                    }
count++;
                }
returnfalse;
            }
        }
    }
returntrue;
}
privatebooleanisValid(introw, intcol, char[][] board, charc) {
for (inti=0; i<9; i++) {
if (board[row][i] ==c) {
returnfalse;
        }
    }
for (inti=0; i<9; i++) {
if (board[i][col] ==c) {
returnfalse;
        }
    }
intstart_row=row/3*3;
intstart_col=col/3*3;
for (inti=0; i<3; i++) {
for (intj=0; j<3; j++) {
if (board[start_row+i][start_col+j] ==c) {
returnfalse;
            }
        }
    }
returntrue;
}


时间复杂度:

空间复杂度:O(1)。

回溯法一个很典型的应用了。

相关文章
|
8月前
leetcode-1518:换酒问题
leetcode-1518:换酒问题
36 0
|
8月前
leetcode-475:供暖器
leetcode-475:供暖器
53 0
|
算法 Python
LeetCode 386. Lexicographical Numbers
给定一个整数 n, 返回从 1 到 n 的字典顺序。
91 0
LeetCode 386. Lexicographical Numbers
|
存储 Python
LeetCode 66. Plus One
给定表示非负整数的非空数字数组,加上整数的1。 存储数字使得最高有效数字位于列表的开头,并且数组中的每个元素包含单个数字。 您可以假设整数不包含任何前导零,除了数字0本身。
94 0
LeetCode 66. Plus One
|
测试技术
一和零(LeetCode-474)
一和零(LeetCode-474)
144 0
一和零(LeetCode-474)
leetcode 283 移动零
leetcode 283 移动零
61 0
|
算法 Java
一和零(LeetCode 474)
一和零(LeetCode 474)
103 0
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
100 0
leetcode第39题
leetcode第54题
在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。
110 0
leetcode第54题
|
算法
leetcode第40题
会发现出现了很多重复的结果,就是因为没有跳过重复的 1。在求 opt [ 1 ] 的时候就变成了 [ [ 1 ],[ 1 ] ] 这样子,由于后边求的时候都是直接在原来每一个列表里加数字,所有后边都是加了两次了。
leetcode第40题