0708 - 面试题 16.11 - 跳水板
二 题目
你正在使用一堆木板建造跳水板。
有两种类型的木板,
其中长度较短的木板长度为 shorter,
长度较长的木板长度为 longer。
你必须正好使用 k 块木板。
编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例:
输入:
shorter = 1
longer = 2
k = 3
输出: {3,4,5,6}
提示:
0 < shorter <= longer
0 <= k <= 100000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diving-board-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* @param {number} shorter
* @param {number} longer
* @param {number} k
* @return {number[]}
*/
var divingBoard = function(shorter, longer, k) {
};
根据上面的已知函数,小伙伴们可以先尝试破解本题,确定了自己的答案后再看下面代码。
三 解题思路
直接暴力破解:
/**
* @param {number} shorter
* @param {number} longer
* @param {number} k
* @return {number[]}
*/
const divingBoard = (shorter, longer, k) => {
// 1. 定义递减数字以及结果集
let sk = k,
lk = k,
result = new Set();
// 2. 收集 shorter 为主的可能
while (sk) {
result.add(shorter * sk + (k - sk) * longer);
sk--;
}
// 3. 收集 longer 为主的可能
while (lk) {
result.add(longer * lk + (k - lk) * shorter);
lk--;
}
// 4. 返回最终结果
return [...result];
};
console.log(divingBoard(1, 2, 3));
然后缩减一次 while
遍历:
const divingBoard = (shorter, longer, k) => {
// 0. 去掉不合理
if (!k) {
return [];
}
// 1. 定义递减数字以及结果集
let newK = k,
result = new Set();
// 2. 收集所有可能
while (newK >= 0) {
result.add(shorter * newK + (k - newK) * longer);
newK--;
}
// 3. 返回最终结果
return [...result];
};
四 统计分析
本题不需要统计分析。
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。