算法打卡第十四天

135 阅读2分钟
  1. 剑指 Offer 12. 矩阵中的路径
  2. 剑指 Offer 13. 机器人的运动范围

剑指 Offer 12. 矩阵中的路径

给定一个m x n 二维字符网格board 和一个字符串单词word 。如果word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

提示: 1 <= board.length <= 200 1 <= board[i].length <= 200 board 和 word 仅由大小写英文字母组成

题意理解 在一个二位数组中找到指定单词,存在返回true,不存在返回false 同一个单元格内的字母不允许重用 采用深度优先和递归算法

  1. 题中给出提示,暂不用做初步判断
  2. 声明常量,存储二位数组长度和单词长度
  3. 遍历二维数组,进行递归
  4. 递归终止条件当前索引不在二维数组中或当前二维数组中的字符不等于单词中的当前字符
  5. 因为字母不允许重用,所以使用过后需要标记为已用

示例 1: 输入:board = [["A", "B", "C", "E"], ["S", "F", "C", "S"], ["A", "D", "E", "E"]], word = "ABCCED" 输出:true

示例 2: 输入:board = [["a", "b"], ["c", "d"]], word = "abcd" 输出:false

var exist = function(board, word) {
    const row = board.length;
    const column = board[0].length;
    const length = word.length;
    for (let i = 0; i < row; i++) {
        for (let j = 0; j < column; j++) {
            if (dfs(board, i, j, word, 0)) {
                return true;
            }
        }
    }

    function dfs(board, i, j, word, k) {
        if (i >= row || j >= column || i < 0 || j < 0 || board[i][j] !== word[k]) return false;
        if (k === length - 1) return true;
        board[i][j] = "/0";
        const res = dfs(board, i - 1, j, word, k + 1) || dfs(board, i + 1, j, word, k + 1) || dfs(board, i, j - 1, word, k + 1) || dfs(board, i, j + 1, word, k + 1);
        board[i][j] = word[k];
        return res;
    }
    return false;
};

剑指 Offer 13. 机器人的运动范围

地上有一个m行n列的方格,从坐标 [0, 0] 到坐标 [m-1, n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

题意理解 找出二维数组,可以连续的符合条件(横纵坐标位数之和小于等于目标值)值的个数 使用Set + 深度优先 + 递归

  1. 从起始点0,0开始递归
  2. 递归终止条件当前索引横纵坐标超出范围或横纵坐标数位之和大于目标值或已访问过该坐标
  3. 存储将访问过的坐标
  4. 先深度,在递归广度

提示: 1 <= n, m <= 100 0 <= k <= 20

示例 1: 输入:m = 2, n = 3, k = 1 输出:3

示例 2: 输入:m = 3, n = 1, k = 0 输出:1

示例 3: 输入:m = 38, n = 15, k = 9 输出:135

var movingCount = function(m, n, k) {
    const set = new Set();

    function sums(x) {
        let sum = 0;
        while (x !== 0) {
            sum += x % 10;
            x = Math.floor(x / 10);
        }
        return sum;
    }

    function dfs(i, j, si, sj, set) {
        if (i >= m || j >= n || k < si + sj || set.has(`${i}-${j}`)) return 0;
        set.add(`${i}-${j}`);
        return 1 + dfs(i + 1, j, sums(i + 1), sums(j), set) + dfs(i, j + 1, sums(i), sums(j + 1), set)
    }
    return dfs(0, 0, 0, 0, set)
}