攒青豆&寻友之旅

88 阅读2分钟

当青训营遇上码上掘金

攒青豆

问题描述: 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)

image.png

以下为上图例子的解析:

输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。

分析: 想要堆青豆就要找到最高的两个边界,计算两个边界围住的体积再减去低于边界高度的柱子。

从左向右开始找,最开始左边界下标为0,右边界下标为左边界+1,然后找大于等于左边界的柱子(若找不到则找其他最高的柱子),同时计算总体积,并减掉中间低于边界的柱子所占的体积。重复这个过程直到右边界下标为数组最后一个下标。

代码实现(Java)

image.png

寻友之旅

问题: 小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1 。 公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)。

请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K 。 输出: 小青到小码家所需的最短时间(以分钟为单位)。

创作过程:

分析 小码在家位置不变; 小青去找小码,每一部都有三种方式可以选择:

  • 向前走1步(+1);
    
  • 向后走1步(-1);
    
  • 坐公交(*2);
    

二者位置分两种情况:

小青位置N小于K

可以选择三种方式(+1、-1、*2);

分情况考虑:

K/2<N

      这种情况比较复杂...
      判断先坐公交再步行往回走和先步行往回走再坐公交哪个到的更快;
      即t1=1+2*N-K,t2=N-K/2+1 。
      最后t取t1、t2中较小的一个。

K/2=N

       t=1

K/2>N

       t=1+K/2-N

小青位置N大于K

只能选择步行 t=N-K

我后来发现,我只考虑到了坐一次公交的情况,如果小青位置很小比如N=1,小码位置很大在99999,会变得比较复杂,最后我放弃了寻友之旅。
(最终寻友之旅没能寻出来😭😭😭)