【刷题日记】17.11. 单词距离

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

本次刷题日记的第 48 篇,力扣题为:17.11. 单词距离中等

一、题目描述:

好久不见,今天我们来继续刷题,最近比较忙,发现人越忙,成长就越少,我认为是自我深度思考的时间变少了,自己和自己对话的时间变少了

继续刷题,锻炼思维

二、这道题考察了什么思想?你的思路是什么?

仔细分析一下这个题目给我们表达了什么信息呢:

  • 我们需要在给出的一堆单词中,找到某两个单词之间最近的距离
  • 给出的这俩单词在这一堆单词中还会重复多次,重复次数随机

那么我们知道,在人群中,两个人最近的距离是什么,相互挨着,或者说相邻的时候是不是就是最近的呢?

就想上面这一组单词一样,咱们要找到 anice 两个单词最近的距离,咱们就想办法找到这俩单词各种情况相邻的时候,最小的距离就可以了

那么,我这里就可以想到使用双指针的方式来处理这个题

还是上面这个图表达的内容

  • 咱们定义一个 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. 单词距离

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

猜你喜欢

转载自juejin.im/post/7102412502171910175