leetcode刷题记录-面试题 17.11. 单词距离

128 阅读1分钟

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

前言

今天的题目为中等,但是是一道比较简单的题,单纯的暴力循环也不会超时,题目中的进阶只是一个思考,在我们需要程序快速运行的时候,能够怎么操作去使得一个查找方法的多次调用时间得到有效缩短

每日一题

今天的题目是 面试题 17.11. 单词距离,难度为中等

  • 有个内含单词的超大文本文件,给定任意两个不同的单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?

示例:

输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"
输出:1

提示:

  • words.length <= 100000

题解

双指针简单遍历

我们可以维护两个指针分别纪录下两个单词出现的位置并且实时更新,同时记录下每次循环当中两个数的距离,不断对比缩小最小距离,最后返回纪录下的最小距离。

这里有几个能够进行优化的点,第一个就是当当前的最小距离更新成为了0的时候,就可以直接退出循环没有必要继续判断了,因为0已经是能够得到的最小的答案了。

还有一个就是只有当当前的两个单词的位置出现了变化才需要去判断距离差距,而不需要每一次循环都去判断,简单的来说就是当碰到了题目要求的单词,就要去更新单词下标以及两个单词的距离。

/**
 * @param {string[]} words
 * @param {string} word1
 * @param {string} word2
 * @return {number}
 */
var findClosest = function (words, word1, word2) {
    const n = words.length;
    let ans = n;
    let q = -1;
    let p = -1;
    for (let i = 0; i < n; i++) {
        const word = words[i];
        if (word === word1) {
            q = i;
            if (p >= 0 && ans > Math.abs(q - p)) {
                ans = Math.abs(q - p);
                if (ans === 0) return ans
            }
        } else if (word === word2) {
            p = i;
            if (q >= 0 && ans > Math.abs(q - p)) {
                ans = Math.abs(q - p);
                if (ans === 0) return ans
            }
        }
    }
    return ans;
};

image.png

哈希表纪录

对于题目中说到的多次调用的情况,我们之前就有处理过类似的题目,一个大数据对象,会多次的去查询它里面的某一个值,这种情况,为了节省查找的时间。我们就能够以空间换时间,将数据都存入哈希表当中,这样子查找的时候就是通过哈希表的键去查找值,就能够节省很多的时间。

总而言之就是一句话,需要快的话,就是以空间去换时间。