You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复generateGridLayout算法以满足网格布局约束?

网格布局生成函数修复需求

需要实现一个名为generateGridLayout(n, minColumns, maxColumns)的函数,生成表示网格的整数数组,需满足以下约束:

  • 接受参数n(元素数量)、minColumns(最小列数)、maxColumns(最大列数),支持如gen(n,3,7)或gen(n,2,256)等调用。
  • 可处理任意数量元素(最大至Number.MAX_SAFE_INTEGER,实际常用不超1000)。
  • 若n为奇数,每行列数必为奇数;若n为偶数,每行列数可为奇或偶。
  • 行之间的列数差值只能为2,且严格递减,不可出现差值大于2的情况(如7不可为[5,2]或[4,4,1],仅可为[7]或[3,3,1])。
  • 若偶数个元素无法以maxColumns满足全奇或全偶行要求,需尝试maxColumns - 1,直至minColumns。
  • 需最小化小行数,即最大化大行数量(如29个元素、最大列数6时,应返回[5,5,5,5,5,3,1]而非其他形式)。

预期输出示例

31
[5, 5, 5, 5, 5, 3, 3]
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1]

30
[5, 5, 5, 5, 5, 5]
[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

29
[5, 5, 5, 5, 5, 3, 1]
[3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1]

28
[6, 6, 6, 6, 4]
[4, 4, 4, 4, 4, 4, 4]

27
[5, 5, 5, 5, 3, 3, 1]
[3, 3, 3, 3, 3, 3, 3, 3, 3]

26
[6, 6, 6, 4, 2, 2]
[4, 4, 4, 4, 4, 4, 4]

23
[5, 5, 5, 5, 3]
[3, 3, 3, 3, 3, 3, 3, 1, 1]

错误示例与理想输出

以26个元素、最大列数7为例,不应返回:

[6, 6, 6, 6, 2] # 差值超过2
[4, 4, 4, 4, 4, 4, 2] # 未最大化最大列数

理想输出应为:

[6, 6, 6, 4, 2, 2] # 最大差值为2,最大化大列数,最小化小行数

当前实现代码

log(29, 2, 7)
log(29, 2, 6)
log(29, 2, 5)
log(29, 2, 4)
log(44, 2, 3)

function distributeGridLayout(
  length,
  minColumns,
  maxColumns
) {
  function recur(
    dp,
    length,
    width,
  ) {
    if (length == 0) {
      return []
    }

    if (length < width - 2 || width <= 0) {
      return
    }

    if (dp[width].has(length)) {
      return
    }

    dp[width].add(length)

    for (let i = 0; i < 2; i++) {
      let result = recur(dp, length - width, width)
      if (result) {
        return [width, ...result]
      }
      width -= 2
    }

    return
  }

  if (length <= maxColumns) {
    return [length]
  }

  if (maxColumns >= 3 && length === 7) {
    return [3, 3, 1]
  }

  if (maxColumns >= minColumns && length % maxColumns === 0) {
    const result = []
    while (length) {
      result.push(maxColumns)
      length -= maxColumns
    }
    return result
  }

  if (maxColumns > 4) {
    if (maxColumns > minColumns && length % (maxColumns - 1) === 0) {
      const result = []
      maxColumns--
      while (length) {
        result.push(maxColumns)
        length -= maxColumns
      }
      return result
    }
  }

  const dec = 2 - (length % 2)

  maxColumns -= maxColumns % dec

  const dp = Array.from(
    { length: maxColumns + 1 },
    () => new Set(),
  )

  for (let width = maxColumns; width > 0; width -= dec) {
    const result = recur(dp, length - width, width)
    if (result) {
      if (width <= minColumns) {
        return
      }
      return [width, ...result]
    }
  }

  return
}

function log(n, min, max) {
  const grid = distributeGridLayout(n, min, max)
  console.log(`gen(${n}, ${min}, ${max})`, grid)
}

问题点

当前代码可处理多数场景,但在调用gen(44, 2, 3)时返回undefined,而预期应返回2列布局(即由22个2组成的数组)。需要修改代码,使其始终符合上述规则。

内容的提问来源于stack exchange,提问作者Lance Pollard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 08:19:58