如何修复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
相关产品推荐
相关产品推荐

