Подсчет количества квадратов в сетке: несколько методов, объясненных примерами кода JavaScript

В этой статье блога мы рассмотрим различные методы подсчета количества квадратов в сетке размером m*n с помощью JavaScript. Мы предоставим примеры кода для каждого метода, чтобы помочь вам понять реализацию. Независимо от того, являетесь ли вы новичком или опытным разработчиком JavaScript, это подробное руководство предоставит вам несколько подходов к решению этой проблемы. Итак, приступим!

Метод 1: математическая формула
Один из способов подсчитать количество квадратов в сетке — использовать математическую формулу. Формула выведена из концепции квадратных чисел. Общее количество квадратов в сетке можно рассчитать по формуле: (m (m + 1)(2m + 1)) / 6, где m представляет собой меньший размер сетки.

Пример кода:

function countSquaresUsingFormula(m, n) {
  const smallerDimension = Math.min(m, n);
  return (smallerDimension * (smallerDimension + 1) * (2 * smallerDimension + 1)) / 6;
}
// Example usage:
const gridWidth = 5;
const gridHeight = 3;
const totalSquares = countSquaresUsingFormula(gridWidth, gridHeight);
console.log("Total squares:", totalSquares);

Метод 2: итеративный подход
Другой метод включает в себя перебор сетки и подсчет количества квадратов путем проверки всех возможных позиций. Этот подход имеет временную сложность O(m * n).

Пример кода:

function countSquaresIteratively(m, n) {
  const smallerDimension = Math.min(m, n);
  let count = 0;
  for (let i = 1; i <= smallerDimension; i++) {
    count += (m - i + 1) * (n - i + 1);
  }
  return count;
}
// Example usage:
const gridWidth = 5;
const gridHeight = 3;
const totalSquares = countSquaresIteratively(gridWidth, gridHeight);
console.log("Total squares:", totalSquares);

Метод 3: динамическое программирование
Динамическое программирование можно использовать для оптимизации итеративного подхода путем сохранения промежуточных результатов во вспомогательной матрице. Этот подход снижает временную сложность последующих запросов до O(1).

Пример кода:

function countSquaresDynamically(m, n) {
  const smallerDimension = Math.min(m, n);
  const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
  let count = 0;
  for (let i = 1; i <= smallerDimension; i++) {
    for (let j = i; j <= m; j++) {
      for (let k = i; k <= n; k++) {
        dp[j][k] = dp[j - 1][k] + dp[j][k - 1] - dp[j - 1][k - 1];
        count += dp[j][k];
      }
    }
  }
  return count;
}
// Example usage:
const gridWidth = 5;
const gridHeight = 3;
const totalSquares = countSquaresDynamically(gridWidth, gridHeight);
console.log("Total squares:", totalSquares);