算法题:面试题 16.11. 跳水板(题目+思路+代码+注释)简单优雅击败100%用户

耗时1ms,击败100%用户。记忆法,时空复杂度O(n)

算法题:面试题 16.11. 跳水板(题目+思路+代码+注释)简单优雅击败100%用户

题目

面试题 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;
    }

 

上一篇:数据分页jdbc+mysql实现


下一篇:剑指 Offer 52. 两个链表的第一个公共节点