840. Magic Squares In Grid 
Description 
A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum.
Given a row x col grid of integers, how many 3 x 3 contiguous magic square subgrids are there?
Note: while a magic square can only contain numbers from 1 to 9, grid may contain numbers up to 15.
Example 1:

Input: grid = [[4,3,8,4],[9,5,1,9],[2,7,6,2]] Output: 1 Explanation: The following subgrid is a 3 x 3 magic square:while this one is not:
In total, there is only one magic square inside the given grid.
Example 2:
Input: grid = [[8]] Output: 0
Constraints:
- row == grid.length
- col == grid[i].length
- 1 <= row, col <= 10
- 0 <= grid[i][j] <= 15
Solutions 
Solution: Math
- Time complexity: O(n2)
- Space complexity: O(1)
JavaScript 
js
/**
 * @param {number[][]} grid
 * @return {number}
 */
const numMagicSquaresInside = function (grid) {
  const n = grid.length;
  const m = grid[0].length;
  let result = 0;
  const isMagicSquare = (row, col) => {
    const upperLeft = grid[row - 1][col - 1];
    const upper = grid[row - 1][col];
    const upperRight = grid[row - 1][col + 1];
    const left = grid[row][col - 1];
    const current = grid[row][col];
    const right = grid[row][col + 1];
    const lowerLeft = grid[row + 1][col - 1];
    const lower = grid[row + 1][col];
    const lowerRight = grid[row + 1][col + 1];
    const nums = new Set([upperLeft, upper, upperRight, left, current, right, lowerLeft, lower, lowerRight]);
    if (nums.size !== 9) return false;
    for (const num of nums) {
      if (num > 9 || num < 1) return false;
    }
    return (
      upperLeft + upper + upperRight === 15 &&
      lowerLeft + lower + lowerRight === 15 &&
      upperLeft + left + lowerLeft === 15 &&
      upper + current + lower === 15 &&
      upperRight + right + lowerRight === 15 &&
      upperLeft + current + lowerRight === 15 &&
      upperRight + current + lowerLeft === 15
    );
  };
  for (let row = 1; row < n - 1; row++) {
    for (let col = 1; col < m - 1; col++) {
      if (grid[row][col] !== 5) continue;
      if (isMagicSquare(row, col)) result += 1;
    }
  }
  return result;
};