Problem: 面试题 17.11. 单词距离
文章目录
- 题目描述
- 思路
- 复杂度
- Code
题目描述
思路
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;}
};