跳水板

时间:2022-07-22
本文章向大家介绍跳水板,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题描述:

你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解决方案

看到题的第一印象,不就是dfs嘛,对于每个位置有两种选择shorter或longer,以O(2^k)的时间复杂度求解,但是发现题目限制k为10e5,很明显的得用O(k)或O(k*log(k))求解,此外我们还注意到,该问题只关注最终的结果,并不关注里面到低是如何排列的,即只关注有多少个shorter多少个longer。

定义longer的数目为i,i从0到k,当前shorter的数目为k- i。

实现代码如下:

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;
    }
}