方阵中的最大乘积

Posted superlizhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了方阵中的最大乘积相关的知识,希望对你有一定的参考价值。

题目

在这个 n×n 方阵中,4个在同一方向(从下至上、从上至下、从右至左、从左至右或者对角线)上相邻的数的乘积最大是多少?

代码一

把乘积先存在一个数组里,然后从成绩数组里找最大值。

  const testGrid = [
    [40, 17, 81, 18, 57],
    [74, 4, 36, 16, 29],
    [36, 42, 69, 73, 45],
    [51, 54, 69, 16, 92],
    [7, 97, 57, 32, 16]
  ];
  function largestGridProduct(arr) {
    let len = arr.length;
    largest = arr[0][0]
    //横向的4位数之和
    console.log('横向的4位数之和')
    for (let row = 0; row < len; row++) {
      for (let col = 0; col < len - 3; col++) {
        console.log(arr[row][col], arr[row][col + 1], arr[row][col + 2], arr[row][col + 3])
        largest = getLargest(arr[row][col] * arr[row][col + 1] * arr[row][col + 2] * arr[row][col + 3])
      }
    }
    //纵向的4位数之和
    console.log('纵向的4位数之和')
    for (let row = 0; row < len - 3; row++) {
      for (let col = 0; col < len; col++) {
        console.log(arr[row][col], arr[row + 1][col], arr[row + 2][col], arr[row + 3][col])
        largest = getLargest(arr[row][col] * arr[row + 1][col] * arr[row + 2][col] * arr[row + 3][col])
      }
    }
    console.log('对角线4为数之和')
    //对角线4为数之和
    for (let row = 0; row < len - 3; row++) {
      for (let col = 0; col < len - 3; col++) {

        console.log(arr[row][col], arr[row + 1][col + 1], arr[row + 2][col + 2], arr[row + 3][col + 3])
        largest = getLargest(arr[row][col] * arr[row + 1][col + 1] * arr[row + 2][col + 2] * arr[row + 3][col + 3])
      }
    }
    console.log('/对角线4为数之和')
    ///对角线4为数之和
    for (let row = 3; row < len; row++) {
      for (let col = 3; col < len; col++) {

        console.log(arr[row][col], arr[row - 1][col - 1], arr[row - 2][col - 2], arr[row - 3][col - 3])
        largest = getLargest(arr[row][col] * arr[row - 1][col - 1] * arr[row - 2][col - 2] * arr[row - 3][col - 3])
      }
    }
    console.log(largest)
    return largest;
  }
  function fun() {
    let largest = 0;
    return function (n) {
      if (n > largest) {
        largest = n;
      }
      return largest
    }
  }
  let getLargest = fun();
  largestGridProduct(testGrid);

代码二

用闭包,存最大值

  const testGrid = [
    [40, 17, 81, 18, 57],
    [74, 4, 36, 16, 29],
    [36, 42, 69, 73, 45],
    [51, 54, 69, 16, 92],
    [7, 97, 57, 32, 16]
  ];
  function largestGridProduct(arr) {
    let len = arr.length;
    productArr = [];
    //横向的4位数之和
    console.log('横向的4位数之和')
    for (let row = 0; row < len; row++) {
      for (let col = 0; col < len - 3; col++) {
        console.log(arr[row][col], arr[row][col + 1], arr[row][col + 2], arr[row][col + 3])
        productArr.push(arr[row][col] * arr[row][col + 1] * arr[row][col + 2] * arr[row][col + 3])
      }
    }
    //纵向的4位数之和
    console.log('纵向的4位数之和')
    for (let row = 0; row < len - 3; row++) {
      for (let col = 0; col < len; col++) {
        console.log(arr[row][col], arr[row + 1][col], arr[row + 2][col], arr[row + 3][col])
        productArr.push(arr[row][col] * arr[row + 1][col] * arr[row + 2][col] * arr[row + 3][col])
      }
    }
    console.log('对角线4为数之和')
    //对角线4为数之和
    for (let row = 0; row < len - 3; row++) {
      for (let col = 0; col < len - 3; col++) {
        console.log(arr[row][col], arr[row + 1][col + 1], arr[row + 2][col + 2], arr[row + 3][col + 3])
        productArr.push(arr[row][col] * arr[row + 1][col + 1] * arr[row + 2][col + 2] * arr[row + 3][col + 3])
      }
    }
    console.log('/对角线4为数之和')
    ///对角线4为数之和
    for (let row = 3; row < len; row++) {
      for (let col = 3; col < len; col++) {
        console.log(arr[row][col], arr[row - 1][col - 1], arr[row - 2][col - 2], arr[row - 3][col - 3])
        productArr.push(arr[row][col] * arr[row - 1][col - 1] * arr[row - 2][col - 2] * arr[row - 3][col - 3])
      }
    }
    console.log(fun(productArr))
    return fun(productArr);
  }
  function fun(arr) {
    let n = 0;
    for (i of arr) {
      if (i > n) {
        n = i
      }
    }
    return n
  }
  largestGridProduct(testGrid);

以上是关于方阵中的最大乘积的主要内容,如果未能解决你的问题,请参考以下文章

如何用伪代码实现二叉树路径上的结点最大乘积

最大乘积(大佬的代码)

线代--矩阵的分解-LU分解n阶方阵

找出数组中的连续最大乘积

[程序员代码面试指南]数组和矩阵问题-数组中子数组的最大累乘积

最大K乘积问题