• 前端与算法 leetcode 36. 有效的数独


    [TOC]

    前端与算法 leetcode 36. 有效的数独


    题目描述

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

    1. 数字 1-9 在每一行只能出现一次。
    2. 数字 1-9 在每一列只能出现一次。
    3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

    上图是一个部分填充的有效的数独。

    数独部分空格内已填入了数字,空白格用 '.' 表示。

    示例 1:

    输入:
    [
      ["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:
    
    输入:
    [
      ["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
    解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。
         但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
    说明:
    

    一个有效的数独(部分已被填充)不一定是可解的。

    • 只需要根据以上规则,验证已经填入的数字是否有效即可。
    • 给定数独序列只包含数字 1-9 和字符 '.' 。
    • 给定数独永远是 9x9 形式的。

    36. 有效的数独

    概要

    这道题的解决方案有很多种,由于数组格式和长度都是固定的,我看到有些神仙甚至写死小宫格的坐标来答题...,题目的要求是行/列/3*3小宫格没有重复数字,在一次迭代内完成即可

    提示

    舍去取整

    解析

    js对map操作有较强的优势,既能通过new Map的方式建立一个hash表,也能直接构建对象的方式来操作,这里为了简化操作直接使用对象,行和列的操作没有难度,小宫格的操作要小心,整除时若带有小数部分,js默认四舍五入,其他语言默认舍去小数部分,小宫格计算方式Math.floor((i / 3)) * 3 + Math.floor(j / 3)中注意使用Math.floor舍去取整,判断是否重复时只需要判断对象的val值是否大于1即可

    算法

    /**
     * @param {character[][]} board
     * @return {boolean}
     */
    // eslint-disable-next-line complexity
    var isValidSudoku = function (board) {
        let [rows, columns, boxes] = [[], [], []];
        for (let i = 0; i < 9; i++) {
            rows[i] = {};// 行数据
            columns[i] = {}; // 列数据
            boxes[i] = {}; // 小宫格
        }
        // const fun = (r, x, y) => (r[x][y] ? r[x][y]++ : (r[x][y] = 1));
        for (let i = 0; i < board.length; i++) {
            for (let j = 0; j < board[i].length; j++) {
                let num = board[i][j];
                if (num !== '.') {
                    let n = parseInt(num, 10);
                    // js中1/3*3计算结果为1 但是按理说应该是0.999无限(浮点误差) 而java中1/3*3则取值为0,浮点数默认舍去0
                    let boxix = Math.floor((i / 3)) * 3 + Math.floor(j / 3);
                    // fun(rows, i, n);
                    // fun(columns, j, n);
                    // fun(boxes, boxix, n);
                    rows[i][n] ? rows[i][n]++ : (rows[i][n] = 1);
                    columns[j][n] ? columns[j][n]++ : (columns[j][n] = 1);
                    boxes[boxix][n] ? boxes[boxix][n]++ : (boxes[boxix][n] = 1);
                    if (rows[i][n] >= 2 || columns[j][n] >= 2 || boxes[boxix][n] >= 2) {
                        return false;
                    }
                }
            }
        }
        return true;
    };
    

    传入[['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
    

    执行结果

    执行用时 :84 ms, 在所有 javascript 提交中击败了92.76%的用户
    内存消耗 :38.1 MB, 在所有 javascript 提交中击败了47.58%的用户
    

    GitHub仓库

    36. 有效的数独

  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/moshuying/p/11834270.html
Copyright © 2020-2023  润新知