LeetCode_17:Shortest Word Distance Easy

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”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值