ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-07-05 18:02:17  阅读:187  来源: 互联网

标签:面试题 longer int 100% 16.11 板子 shorter 长度 gap


耗时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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有