力扣面试题 17.11. 单词距离(双指针)

Problem: 面试题 17.11. 单词距离

文章目录

  • 题目描述
  • 思路
  • 复杂度
  • Code

题目描述

力扣面试题 17.11. 单词距离(双指针)_第1张图片

思路

Problem力扣面试题 16.06. 最小差

该题目只需预先做一些处理,即可以转换为上述题目:

1.预处理操作:定义两个数组w1ps,w2ps用于记录在words数组中两个单词word1与word2每次出现的位置;
2.双指针操作:用两个指针p1,p2分别指向两个数组的开头,同时用一个变量minRet记录两个单词之间的距离;若p1指向的数大于p2指向的数(若当前两个单词距离小于minRet则更新minRet)则p2++;反知p1++(若当前两个单词距离小于minRet则更新minRet)

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为数组words的大小

空间复杂度:

O ( n ) O(n) O(n)

Code

class Solution {
public:
    /**
     * Two pointer
     * @param words Given array 
     * @param word1 Given word1
     * @param word2 Given word2
     * @return int
     */
    int findClosest(vector<string> &words, string word1, string word2) {
        vector<int> w1ps;
        vector<int> w2ps;
        for (int i = 0; i < words.size(); ++i) {
            string word = words[i];
            if (word == word1) {
                w1ps.push_back(i);
            } else if (word == word2) {
                w2ps.push_back(i);
            }
        }
        int p1 = 0;
        int p2 = 0;
        int minRet = INT32_MAX;
        while (p1 < w1ps.size() && p2 < w2ps.size()) {
            int pos1 = w1ps[p1];
            int pos2 = w2ps[p2];
            if (pos1 > pos2) {
                if (minRet > pos1 - pos2) {
                    minRet = pos1 - pos2;
                }
                p2++;
            } else {
                if (minRet > pos2 - pos1) {
                    minRet = pos2 - pos1;
                }
                p1++;
            }
        }
        return minRet;
    }
};

你可能感兴趣的:(力扣题目,leetcode,算法,职场和发展)