当青训营遇上码上掘金-后端题目

54 阅读2分钟

当青训营遇上码上掘金

寻友之旅

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。

步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1

公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

请帮助小青通知小码,小青最快到达时间是多久?

输入: 两个整数 N 和 K

输出: 小青到小码家所需的最短时间(以分钟为单位)

广度优先方法

可以使用广度优先方法解题,对于每一个节点X,只有三种扩展的方式,一种方法是扩展到X-1,一种方法是扩展到X+1,最后一种方法是扩展到X*2。因此从节点X开始进行广度优先遍历,记录广度优先遍历的层数,同时记录遍历到过的节点从而避免重复遍历。到达节点K时停止,这样即可得到到达节点K时的最短的时间。

可以增加一个限制条件,如果节点X的位置大于K,说明不可能通过X+1或者X*2的方式到达K,因此可以不去判断这两个分支,最大的节点X设置为2*K+1即可。

代码如下:

攒青豆

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

攒青豆.png

以下为上图例子的解析:

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

单调栈解法

维护一个单调递减栈

当前元素小于栈顶元素时,进栈,表示还有更低的位置

当大于栈顶元素时,说明可以构成一个凹槽,栈顶元素出栈,并判断栈顶元素两边柱子的最小高度,取最小高度作为凹槽的高度。直到碰到栈顶元素大于当前元素时再次进栈。

思路是要找到栈顶柱子两边的最小柱子的高度,然后乘上柱子之间的宽度就是凹槽盛的青豆数量。

代码如下: