美文网首页
一道简单的算法题(1)

一道简单的算法题(1)

作者: Loving_1109 | 来源:发表于2020-10-21 11:06 被阅读0次

问题

给定一个二维正数数组,如下。从任意一个点出发,求最长递增长度。假如从下标(0,1),即数字2出发,则最长递增为2-3-4-8-99,长度为5

[
  [1,2,3,4],
  [5,6,7,8],
  [13,4,5,99],
]

解法

求解这题的思想是使用动态规划和深度遍历算法。对于我们所求的一个点,假如我们已经知道从这个点开发,所能走的最大长度,那么就直接返回。如果暂时还没有最大长度,那么就从这个点开始寻找最大的长度。直接看代码。

/**
 * 
 * @param {Array<Array<number>>} data 
 * @param {number} row 
 * @param {number} column 
 */
function findpath(data, row, column) {
  let cache = {}; //缓存已经遍历的点
  let dataRow = data.length;
  let dataColumn = data[0].length;
  function key(row, column) {
    return `${row}${column}`;
  }
  //数组边界验证
  function valide(row, column) {
    if (row < 0 || row >= dataRow) {
      return false;
    }
    if (column < 0 || column >= dataColumn) {
      return false;
    }
    return true;
  }
  // 主方法
  function find(data, row, column) {
    // 如果存在,则直接返回
    if (cache[key(row, column)]) {
      return cache[key(row, column)];
    }
    let v = data[row][column];
    let left = valide(row, column-1) && data[row][column-1] > v ? find(data, row, column-1) : 0;
    let right = valide(row, column+1) && data[row][column+1] > v ? find(data, row, column+1) : 0;
    let top = valide(row - 1, column) && data[row - 1][column] > v ? find(data, row - 1, column) : 0;
    let bottom = valide(row + 1, column) && data[row + 1][column] > v ? find(data, row + 1, column) : 0;
    let max = Math.max(left, top, right, bottom) + 1;
    return max;
  }
  return find(data, row, column);
}

相关文章

网友评论

      本文标题:一道简单的算法题(1)

      本文链接:https://www.haomeiwen.com/subject/umusmktx.html