当青训营遇上码上掘金
攒青豆
问题描述: 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
分析: 想要堆青豆就要找到最高的两个边界,计算两个边界围住的体积再减去低于边界高度的柱子。
从左向右开始找,最开始左边界下标为0,右边界下标为左边界+1,然后找大于等于左边界的柱子(若找不到则找其他最高的柱子),同时计算总体积,并减掉中间低于边界的柱子所占的体积。重复这个过程直到右边界下标为数组最后一个下标。
代码实现(Java)
寻友之旅
问题:
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 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,会变得比较复杂,最后我放弃了寻友之旅。
(最终寻友之旅没能寻出来😭😭😭)