LeetCode 840题 矩阵中的幻方 -- JavaScript

版权声明:版权所有,转载、引用请指明出处! https://blog.csdn.net/qq_30216191/article/details/82228083

题目描述:

3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。

给定一个由整数组成的 N × N 矩阵,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。

示例 : 

输入: [[4,3,8,4],
      [9,5,1,9],
      [2,7,6,2]]
输出: 1
解释: 下面的子矩阵是一个 3 x 3 的幻方:
      438
      951
      276

提示:

  1. 1 <= grid.length = grid[0].length <= 10
  2. 0 <= grid[i][j] <= 15

方法分析:

我们只要弄明白了幻方的概念,该题就迎刃而解了。

  • 幻方是一个三行三列,即 3 x 3 ,共九个元素构成的矩阵
  • 这九个元素不能重复
  • 这九个元素的取值范围都为 [1,9]
  • 每行,每列以及两条对角线上的各数之和都相等

接下来,就用代码来实现。

代码实现:

var numMagicSquaresInside = function(grid) {
  let rows = grid.length;
  let cols = grid[0].length;
  if(rows < 3 || cols < 3) return 0;
  let count = 0;
  for(let i = 0;i < rows -2;i++){
      for(let j = 0;j < cols -2;j++){
         count += isMagic(i,j,grid);
      }
  }
 return count; 
};
function isMagic(row, col, array) {
  let arr = [];
  for(let i = row;i < row + 3;i++){
    for(let j = col;j < col + 3;j++){
      if(array[i][j] > 9 || array[i][j] < 1) return 0;
        arr.push(array[i][j]);
      }
  }
  if(new Set(arr).size < arr.length) return 0;
  const sum = arr[0] + arr[1] + arr[2];
  const r2 = arr[3] + arr[4] + arr[5];
  const r3 = arr[6] + arr[7] + arr[8]; 
  const c1 = arr[0] + arr[3] + arr[6];
  const c2 = arr[1] + arr[4] + arr[7];
  const c3 = arr[2] + arr[5] + arr[8];
  const xy1 = arr[0] + arr[4] + arr[8];
  const xy2 = arr[2] + arr[4] + arr[6];
  if(sum == r2 && sum == r3 && sum == c1 && sum == c2 && sum == c3 && sum == xy1 && sum == xy2) return 1;
  return 0;
}

代码解析:

代码看着挺长,其实也不算太复杂。下面进行分解。

numMagicSquaresInside内部,我们首先判断输入矩阵的行、列是否小于3,如果小于3,该矩阵必然不存在幻方子矩阵;否则的话,就对该矩阵进行遍历,并对每个元素调用isMagic函数,判断其是否为幻方。注意遍历终点为length - 2即可,因为幻方为3x3阶嘛。

在isMagic内部,我们从输入位置开始,构建一个3x3共9个元素的子矩阵(数组)。如果数组中的元素不在[1,9]之间,直接返回0;如果数组中有重复元素,也返回0;否则的话就判断子矩阵每行,每列以及两条对角线上的各数之和是否相等。相等,即为幻方,返回1,否则返回0.

参考链接:https://leetcode-cn.com/problems/magic-squares-in-grid/description/

猜你喜欢

转载自blog.csdn.net/qq_30216191/article/details/82228083