本次刷题日记的第 48 篇,力扣题为:17.11. 单词距离 ,中等
一、题目描述:
好久不见,今天我们来继续刷题,最近比较忙,发现人越忙,成长就越少,我认为是自我深度思考的时间变少了,自己和自己对话的时间变少了
继续刷题,锻炼思维
二、这道题考察了什么思想?你的思路是什么?
仔细分析一下这个题目给我们表达了什么信息呢:
- 我们需要在给出的一堆单词中,找到某两个单词之间最近的距离
- 给出的这俩单词在这一堆单词中还会重复多次,重复次数随机
那么我们知道,在人群中,两个人最近的距离是什么,相互挨着,或者说相邻的时候是不是就是最近的呢?
就想上面这一组单词一样,咱们要找到 a
和 nice
两个单词最近的距离,咱们就想办法找到这俩单词各种情况相邻的时候,最小的距离就可以了
那么,我这里就可以想到使用双指针的方式来处理这个题
还是上面这个图表达的内容
- 咱们定义一个 p1 来表示 word1 默认当前位置,初始化的时候为 -1,定义一个 p2 来表示 word2 默认的当前位置
- 遍历给出的 words ,当遍历到当前单词和 word1 一致时,则将该位置赋值给 p1
- 同理,将 word2 当前位置赋值给 p2
- 当校验到 p1 和 p2 都是大于等于的时候,则计算他们俩的差值,直到遍历 words 完毕,取所有差值的最小值即可
不过这里我们需要注意,初始化 p1 , p2 当前位置为 -1 这里不用过多解释,但是我们需要初始化一个数字是比较大的,可以指定为 words 的长度
这样的目的是,咱们逻辑清晰,且避免计算出错,保证第一次计算最小值比较的时候,得到的最小值一定是实际的值。
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码
编码如下:
func findClosest(words []string, word1 string, word2 string) int { var p1,p2 = -1,-1 // 此处需要注意定义 res 的时候,可以大一点,可以为整个 words 的长度,这是为了避免咱们在计算两个单词最小值的时候,计算出错 var res = len(words) for index,w := range words { if w == word1 { p1 = index } if w == word2 { p2 = index } if p1 >=0 && p2 >= 0{ res = min(help(p1,p2) , res) } } return res } func help (a,b int) int { if a > b{ return a-b } return b-a } func min (a,b int) int { if a > b { return b } return a }
四、总结:
这里我们可以看到,这种双指针的实现方式,我们只遍历了一次 words 数组,则此处我们的时间复杂度是 O(n)
空间复杂度比较明确,我们引入的空间消耗为 O(1)
原题地址:面试题 17.11. 单词距离
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~