携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
本次刷题日记的第 79 篇,力扣题为:1184. 公交站间的距离
一、题目描述:
好久不刷题,没有锻炼思维,感觉脑袋都要生锈了,刷题感觉还是要从简单题刷题才能慢慢找到感觉
就想面试一样,好久不面试,前几次面试大概率都是用来练手的
今天开始来刷一个简单的题,公交车之间的距离
二、这道题考察了什么思想?你的思路是什么?
看这个题 ,其实和我们平日里面的生活还是息息相关的,例如我们到市区里面坐公交车,如果是那种环形的公交车,我们在判断从正向走还是反向走的时候,可能生活中,我们是根据车站的个数来判断哪边近哪边远的
但是今天这个题更加的明确,题目给出 n 个公交车站,分别编号为 0 到 n-1,并且给出了一个数组,distance[i] ,表示从 i 车站,到 i+1%n 的车站距离
题目要求我们,找到 start 车站到 destination 车站最近的距离
分析
根据题中,我们可以知道,对于环形的车站,很明确,要么正向,要么反向,就目前来看就只有 2 条路,其实对于我们计算起来并不复杂
例如题目中给出的例子,有 4 个车站,分别是 0,1,2,3
车站编号 | 0 | 1 | 2 | 3 |
当前车站到下一个车站的距离 | 1 | 2 | 3 | 4 |
例如,我们需要找到 1 号车站到 3 号车站的距离,
正向:2+3 = 5
反向:1+4 = 5
这么看来,正向反向都可以
其实这么看来,我们在计算的时候,只需要计算 start 到 destination 的距离 num1, 和计算 destination 到 start 的距离 num2,最后取一个最小值即可
换句话说就是,start -> destination 中间经过的距离为 num1,destination -> start 中间经过的距离为 num2 ,咱们只需要遍历一次 distance 数组就可以得出结论了
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码,一起愉快编码吧
编码如下:
func distanceBetweenBusStops(distance []int, start int, destination int) int { // 咱们先确保 start 的值是一定小于 destination 的 if start > destination { start, destination = destination, start } // 定义 2 个值,num1 表示正向的距离,num2 表示反向的距离 var ( num1 int num2 int ) for i, des := range distance { if start <= i && i<destination { num1 += des }else{ num2 += des } } return min(num1, num2) } func min(a, b int) int { if a < b { return a } return b }
四、总结:
开篇的题用来练手,虽然简单,但是我们也可以去练习思考方式,以及做题的感觉
本题做法时间复杂度是 O(n) , 咱们遍历了一遍 distance 数组,空间复杂度是 O(1) ,我们引入的空间消耗属于常数级别的
原题地址:1184. 公交站间的距离
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~