算法题:面试题 16.11. 跳水板(题目+思路+代码+注释)简单优雅击败100%用户
作者:互联网
耗时1ms,击败100%用户。记忆法,时空复杂度O(n)
题目
面试题 16.11. 跳水板
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。
返回的长度需要从小到大排列。
示例 1
输入:
shorter = 1
longer = 2
k = 3
输出: [3,4,5,6]
解释:
可以使用 3 次 shorter,得到结果 3;使用 2 次 shorter 和 1 次 longer,得到结果 4 。以此类推,得到最终结果。
提示:
0 < shorter <= longer
0 <= k <= 100000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diving-board-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
- 特殊情况,k=0, shorter等于longer 直接返回结果
- 其他需要动态算的结果按算法算
- 既然是只有两种板子,那么每一根不是短的就是长的,可以想象一下,比如3块
- 短 短 短
- 从极限两端考虑,首先考虑最短的情况,全部是短的,最长的情况是全部最长的,那么我们需要求的就是最短的+每次用一块长的换掉一块短的,最长的。而每次替换的过程,替换后的增量其实是恒定的=长的减去短的。那么其实容易想到,就等于 [n个短板,第n个总长度=n个短板+(k-n)个长板子, n个长板]
- 中间的我们做变换减少运算量
- 第n个总长度=n个短板+(k-n)个长板子=k短板+n(长板子-短板子)=上一个总长度+(长板子-短板子)
- 用数据举例
- 板子为 1 2
- 块数 k为3
- [1+1+1, 2+1+1, 2+2+1, 2+2+2]
- 是不是符合上面的推理,长板子-短板子=2-1=1,这样就减少了运算量
- [3 , 3+1=4, 4+1=5, 5+1=6]
代码
下面代码有种代码如诗的感觉了。
public int[] divingBoard(int shorter, int longer, int k) {
//特殊情况直接返回
if (k==0){
return new int[0];
}
//相等只有一种可能
if (shorter == longer){
return new int[]{shorter*k};
}
//不相等有 k+1种可能,如果理解不了那这个就会成为障碍
int[] ret = new int[k+1];
int gap = longer - shorter;
//从全部用最短的开始记忆,一直到全部用最长的,请注意一定要 min=shorter*k-gap,因为循环体里是 min+gap,对第一个也加了跟最长的,所以需要归位
for (int i =0,min=shorter*k-gap;i<=k;i++){
ret[i] = min= min+gap;
}
return ret;
}
标签:面试题,longer,int,100%,16.11,板子,shorter,长度,gap 来源: https://blog.51cto.com/humorchen/2984245