问题描述:
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
代码语言:javascript复制示例:
输入:
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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解决方案
看到题的第一印象,不就是dfs嘛,对于每个位置有两种选择shorter或longer,以O(2^k)的时间复杂度求解,但是发现题目限制k为10e5,很明显的得用O(k)或O(k*log(k))求解,此外我们还注意到,该问题只关注最终的结果,并不关注里面到低是如何排列的,即只关注有多少个shorter多少个longer。
定义longer的数目为i,i从0到k,当前shorter的数目为k- i。
实现代码如下:
代码语言:javascript复制class Solution {
public int[] divingBoard(int shorter, int longer, int k) {
if(k == 0){
return new int[0];
}
if(shorter == longer){
return new int[]{shorter * k};
}
int[] result = new int[k 1];
for(int i = 0; i <= k; i ){
result[i] = i * longer shorter * (k - i);
}
return result;
}
}