最近比较烦,被领导拉去谈话说年后是不是就要跳槽走,凭着我这直男的性子,脱口而出“是的,除非涨薪比较明显”。说完就后悔了,今年吧在这家公司吧也没啥成绩就急着走人,以后的日子贼尴尬。我吧一直对算法比较感兴趣,可是脑子就是转不快,就有时候后端说的东西都有点不明白,一直被同层级的后端牵着走。说实话自己是个失败的前端,沟通能力又极为欠缺,实在找不到什么优点,除了对vue和原生js相对更懂一些,其他的都不太懂。虽然懂得东西少的可怜,但是我知道只要把算法能力提升一个高度,一切都会不一样的,坚持刷leetcode。
数独:1.9X9棋盘格
2.每一行填入1-9不重复,每一列一样
3.9X9的棋盘格又可细分为9个3X3的小棋盘格,每个3X3的小棋盘格填入1-9,并且小棋盘格里的数字也不能重复
说来惭愧,这道题和之前做过的n皇后问题属于一个问题,动态规划,只不过现在又忘了怎么做了,正好今天复习一下
动态规划:按我的理解动态规划就是递归,只不过每一次递归都把所有的可能结果保存起来,当递归完成也就取到了所有可能的结果,可以用来解决最优解的问题,如背包问题。
解题思路:1.遍历:递归遍历这个二维数组(棋盘格)
2.带入可选值:如果当前值为数值则跳过,若为"."则逐步带入1-9并判断其合法性
3.是否符合要求:检测带入的值是否符合要求
思路简单,但要原原本本写出代码通过测试还是需要一定功底的。代码如下:
var solveSudoku = function(board) { if(board.length===0 || board.length!==9 || board[0].length!==9) return ; dfs(board,0,0); }; // 判断是否符合要求 /** *1.每一行值各不相同 *2.每一列值各不相同 *3.每个3X3的小棋盘里的值各不相同 */ var isValid=function(board,i,j){ for(let col=0;col<9;col++){ if(col!==j && board[i][j]===board[i][col]) return false; } for(let row=0;row<9;row++){ if(row!==i && board[i][j]===board[row][j]) return false; } for(let row=parseInt(i/3)*3;row<parseInt(i/3)*3+3;row++){ for(let col=parseInt(j/3)*3;col<parseInt(j/3)*3+3;col++){ if((row!==i || col!==j)&&board[i][j]===board[row][col]) return false; } } return true; }; /** *递归遍历,边界判断,逐个数字带入值为'.'的方格,判断其是否符合要求 */ var dfs=function(board,i,j){ if(i===9) return true; if(j>=9) return dfs(board,i+1,0); if(board[i][j]==='.'){ for(let k=1;k<=9;k++){ board[i][j]=k+''; if(isValid(board,i,j)){ if(dfs(board,i,j+1)) return true; } board[i][j]='.'; } }else{ return dfs(board,i,j+1); } return false; };