1、总结
留意方法三相对于方法一的优化!
- 隐约有一个总结,待验证:对于数组求最小最大值的操作,尽量优化为单向遍历(或双向遍历/反向遍历…),用于过渡的变量尽可能少(1个或更少);
- 这道题由于没有subscribe,因此只能自己写一写,没有详细的性能测试结果;
2、题目
Given a list of words and two words word1 and word2, return the shortest distance between these two words in the list.
Example:
Assume that words = ["practice", "makes", "perfect", "coding", "makes"].
Input: word1 = “coding”, word2 = “practice”
Output: 3
Input: word1 = "makes", word2 = "coding"
Output: 1
Note:
You may assume that word1 does not equal to word2, and word1 and word2 are both in the list.
3、我的解法 自己写的demo测试通过,未经过LeetCode变态测试
方法一:单向遍历,每次匹配到新的word1、word2时,更新最短距离 由于是单向遍历,因此当word2刷新时,只需要与最近一次的word1匹配即可保证是与各个word1之间的最短距离;word1刷新时同理。返回各个“最短距离”的最小值;
时间复杂度 O(n),空间复杂度 O(1)
/**
* @param {string[]} words
* @param {string} word1
* @param {string} word2
* @return {number}
*/
// 方法一:
var shortestDistance = function(words, word1, word2) {
let shortest = Number.MAX_SAFE_INTEGER;
let tempIndex1 = -1;
let tempIndex2 = -1;
for(let i = 0; i < words.length; i++) {
if(words[i] == word1) {
tempIndex1 = i;
} else if(words[i] == word2) {
tempIndex2 = i;
}
if(tempIndex1 > -1 && tempIndex2 > -1) {
shortest = Math.min(Math.abs(tempIndex2 - tempIndex1), shortest);
}
}
return shortest;
};
方法二:当然是暴力破解啦~ 不想写,但是想了一下发现光靠想象还真不太好写的样子。
4、其他解法
看了网上的资料,发现解法一跟我的一样也是开心。
至于暴力破解的话,思路如下:遍历一遍words,保存所有的word1、word2,再遍历 word1 list 和word2 list 比较所有可能的距离,取最小值;
方法三:优化方法一,仅创建一个变量
/**
* @param {string[]} words
* @param {string} word1
* @param {string} word2
* @return {number}
*/
// 方法三:
var shortestDistance = function(words, word1, word2) {
let shortest = Number.MAX_SAFE_INTEGER;
let tempIndex = -1;
for(let i = 0; i < words.length; i++) {
// console.log(words[i]);
if(words[i] == word1 || words[i] == word2) {
if(tempIndex != -1 && words[tempIndex] != words[i]) {
shortest = Math.min(shortest, i - tempIndex);
}
tempIndex = i;
}
}
return shortest;
};
相对于方法一而言,时间复杂度和空间复杂度都应该稍降低了
。这是因为方法一不论当前更新的元素与最近更新的元素是否相同,都进行了最短距离的计算和比较。事实上这是不必要的消耗,例如:
Assume that words = ["practice", "makes", "makes", "coding", "makes"].
Input: word1 = “makes”, word2 = “practice”