当青训营遇上码上掘金

47 阅读2分钟

当青训营遇上码上掘金

主题 3:寻友之旅

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

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

思路

类似最短路径题目,可考虑的有:广度优先搜索算法BFS,贪心算法,优化的迪杰斯特拉算法等。

有多种可能情况。

可能一:如果N>K,小青只能步行从N走到K,最短时间为N−K;

可能二:如果N=K,小青不用移动,最短时间为0;

可能三:如果N<K,小青可以选择坐公交和步行前往,可以采用贪心算法或者BFS求。

首先fmt.Scan获取到输入的N、K,for循环判断只要N小于K就一直乘坐公交,ans+1。只要N大于等于K就判断现在通过步行的结果(ans + N - K)与N>K之前最后一次不乘坐公交直接进行步行的结果(ans - 1 + K - N/2)比较,取最小值输出。

主题 4:攒青豆

现有 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 个单位的青豆。

思路

同力扣接雨水问题,采用双指针。

如果节点的高度小于它左右两侧节点的最大值,则可以接到雨水。

先从左往右遍历,求出对于当前节点而言的左侧最大值,同理再求出右侧最大值即可。

时间复杂度:  每次移动只做减法,两指针移动总次数不超过高度 n,时间复杂度 O(n)

空间复杂度:   O(1)