当青训营遇上码上掘金
主题 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 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入: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)