LeetCode 面试题 16.11. 跳水板 简单
题目描述
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为 shorter,长度较长的木板长度为 longer。你必须正好使用 k 块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例 1
javascript
输入:
shorter = 1
longer = 2
k = 3
输出: [3,4,5,6]
解释:
可以使用 3 次 shorter,得到结果 3;使用 2 次 shorter 和 1 次 longer,得到结果 4 。以此类推,得到最终结果。
提示:
javascript
0 < shorter <= longer;
0 <= k <= 100000;
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/diving-board-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
排列组合也算比较简单,需要 k
个板子,当我们短板有 i
个的时候,长板子就是 k-i
个,由于题目要求是将结果从小到大进行排序,那么我们起初就尽可能多的取短板子,最后结果就是通过 [0,k]
范围内遍历一遍即可。
对于特殊情况,即短板和长板长度相同时,我们只需要返回 k*len
即可,不然会重复计算。
javascript
var divingBoard = function (shorter, longer, k) {
if (k === 0) return [];
if (shorter === longer) return [k * shorter];
let res = [];
for (let i = k; i >= 0; i--) {
let shortCnt = i;
let longCnt = k - i;
let cnt = shortCnt * shorter + longCnt * longer;
res.push(cnt);
}
return res;
};
cpp
class Solution {
public:
vector<int> divingBoard(int shorter, int longer, int k) {
if (k == 0) return {};
if (shorter == longer) return {k * shorter};
vector<int> res;
for (int i = k; i >= 0; i--) {
int shortCnt = i;
int longCnt = k - i;
int cnt = shortCnt * shorter + longCnt * longer;
res.push_back(cnt);
}
return res;
}
};
java
class Solution {
public int[] divingBoard(int shorter, int longer, int k) {
if (k == 0) return new int[0];
if (shorter == longer) return new int[]{k * shorter};
int[] res = new int[k + 1];
for (int i = 0; i <= k; i++) {
int shortCnt = i;
int longCnt = k - i;
int cnt = shortCnt * shorter + longCnt * longer;
res[i] = cnt;
}
return res;
}
}
python
class Solution:
def divingBoard(self, shorter: int, longer: int, k: int) -> List[int]:
if k == 0: return []
if shorter == longer: return [k * shorter]
res = []
for i in range(k + 1):
shortCnt = i
longCnt = k - i
cnt = shortCnt * shorter + longCnt * longer
res.append(cnt)
return res
javascript
学如逆水行舟,不进则退