动态算法(基础四)笔记回顾

1、有效的数独

示例 1:


输入:board =
[["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
示例 2:

输入:board =
[["8","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"]]
输出:false

/**
 * @param {character[][]} board
 * @return {boolean}
 */
var isValidSudoku = function(board) {
    var rowMap = new Map();                  //创建行的hash表
    var columnMap = new Map();               //创建列的hash表
    var circleMap = new Map();               //创建3*3的hash表
    for(var i=0; i<board.length; i++){       //循环行的长度
        for(var j=0; j<board[i].length; j++){//循环列的长度
            if(board[i][j]==='.'){            //如果这个元素不是数字就继续
                continue;                     
            }
            if(rowMap.get(`${i}_${board[i][j]}`)){   // 检查当前数字在当前行是否已经出现过,如果出现则返回false
                return false
            }else{
                rowMap.set(`${i}_${board[i][j]}`,true)// 将当前数字标记为已经出现
            }
            if(columnMap.get(`${j}_${board[i][j]}`)){// 检查当前数字在当前列是否已经出现过,如果出现则返回false
                return false
            }else{
                columnMap.set(`${j}_${board[i][j]}`,true)// 将当前数字标记为已经出现
            }
            if(circleMap.get(`${Math.floor(i/3)}_${Math.floor(j/3)}_${board[i][j]}`)){ // 检查当前数字在当前3x3小九宫格内是否已经出现过,如果出现则返回false
                return false
            }else{
                circleMap.set(`${Math.floor(i/3)}_${Math.floor(j/3)}_${board[i][j]}`,true)                                              // 将当前数字标记为已经出现
            }
        }
    }
    return true                                          // 若通过上述检查,返回true,表示数独有效
};
  • if(rowMap.get(${i}_${board[i][j]})):首先,使用 rowMap.get(${i}_${board[i][j]}) 来检查当前行中的当前数字是否已经在 rowMap 中出现过。如果 rowMap 中存在以 ${i}_${board[i][j]} 作为键的值,即表示当前数字在当前行已经出现过。此时条件成立,执行代码块中的内容。

  • return false;:如果条件成立,即表示当前数字在当前行已经出现过,因此函数返回 false,表示数独不符合规则。

  • rowMap.set(${i}_${board[i][j]}, true);:如果当前数字在当前行没有出现过,那么将其标记为已经出现。在这里,我们使用 rowMap 的 set 方法,以 ${i}_${board[i][j]} 作为键,并将值设置为 true,表示当前数字已经在当前行中出现过

2、旋转图像

示例 1:


输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:


输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

var rotate = function(matrix) {
    const n = matrix.length;              //获取矩阵大小
    const matrix_new = new Array(n).fill(0).map(() => new Array(n).fill(0)); //新建一个矩阵用0将所有元素填满
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            matrix_new[j][n - i - 1] = matrix[i][j];  //此为二维数组常用旋转对应表达式
        }
    }
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            matrix[i][j] = matrix_new[i][j];          //最后在把新建数组的值进行覆盖操作
        }
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值