整数拆分

  • 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例1

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例2

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

数学规律

const integerBreak = n => {
  if (n <= 3) return n - 1

  let res = 1
  while (n > 4) {
    res *= 3
    n -= 3
  }
  res *= n
  return res
}

3的n次方

const integerBreak_pow = (n) => {
  if (n <= 3) return n - 1

  const x = ~~(n / 3), y = n % 3

  //恰好整除,直接为3^x 
  if (y === 0) return Math.pow(3, x)
  //余数为1,退一步 3^(x-1)*2*2 
  if (y === 1) return Math.pow(3, x - 1) * 4
  //余数为2,直接乘以2
  return Math.pow(3, x) * 2
}

动态规划

export const integerBreak_dp = function (n) {
  let memo = []
  memo[1] = 1

  for (let i = 2; i <= n; i++) {
    let max = 0
    for (let j = 1; j < i; j++) {
      max = Math.max(
        max,
        // 不继续拆分 i - j,直接对比一次
        // 比如 1 和 2,不光要对比 1 * (2 拆分后的结果)
        // 也要直接对比 1 * 2
        j * (i - j),
        j * memo[i - j]
      )
    }
    memo[i] = max
  }

  return memo[n]
}

console结果可能不准确,按F12打开控制台查看