寻友之旅
题目描述如下
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
代码: 实现思路: 本算法采用递归解决,判断条件为N > K || (K-N) < N/2 跳出本层遍历,N>K代表,N走在K的前面,由于题中描述,只能步行往后退,无法乘坐公交车前行,所以此时所需要花的时间就是N-K的绝对值,如果(K-N) < N/2,既K在N的前方,N可以选择乘坐公交还是通过步行前往,这里的判断条件是如果,N与K之间的距离需要用步行来代替,就是剩下的最后的路程无法继续使用公交(再使用的话就会做过浪费时间),此时就会将剩下的时间用步行的时间来代替。再每一次递归的时候时间都会加一分钟,该算法的时间复杂度为o(n)空间复杂度为o(1)。 本算法的核心就是找到判断的最终条件,进行结束递归,找到该条件后,此题目也就迎刃而解
攒青豆 题目描述如下
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
代码
该算法可以利用双指针法进行遍历得到最终的结果,具体的实现思路是分别记录左端和右端的索引和左端的的最大值和右端的最大值进行比较;两个双边指针分别向中间递进,并且左端指针索引永远小于等于右端索引,如果左端索引值大于右端,则最终能接得的豌豆的ret就等于得到的右端的最大值减去当前的右端索引值,进而得到本轮所得到的豌豆数量。
经分析该算法的时间复杂度为o(n)空间复杂度为O(1) 该算法的核心也有回溯的思想,用一个数组记录上一次端点最大值,在进行下一轮比较的时候能够将上一轮的索引值进行比对,从而得到最大的索引值,将他们进行相减就得到最终的结果 总结:
这两道算法题,我对此获益良多,了解了很多算法相关的知识,巩固了自己的算法基础,对程序有了更深一步的认识,为自己以后从事后端工作,有了一个较好的铺垫。 后端还是卷啊,前端的两个题都是啥啊,后端上来就搞算法题,可见一般