shortest-word-distance-ii
- Medium
- keyword: map
- 类似: 2 sum closest
For example, Assume that words = ["practice", "makes", "perfect", "coding", "makes"]. Given word1 = “coding”, word2 = “practice”, return 3. Given word1 = "makes", word2 = "coding", return 1.
思路
- 建立一个map: 找到string->list(index).
然后对于每2个word, 找最接近的index. 这道题目的关键是怎么找最近的距离?
- 什么是最近的距离? 例如word1的list是: [1,3,9], word2的list是: [5,10]. 那么最近的距离是[9,10], 即1. 即abs(a[i], b[j])最小. 这个怎么找? 于是问题转化为2个排好序的数组, 找最小差值.
最直接的想法自然是: O(m*n), 即对2个for loop, outer loop处理list1, inner loop处理list2.
想到2Sum closest的O(m+n)做法. 不过有点区别:
- 它那个是
l=0, r=n-1
, 因为从大缩到小. 这里是找最接近的, 所以
p1 = 0, p2 = 0
. 但这样不会导致while(p1<list1.length && p2.list2.length)
提前退出吗? Ans: 并不会, 因为对于递增的处理是这样的:while(p1<list1.length && p2.list2.length) { if (diff < abs(list1[p1] - list2[p2])) { diff = abs(list1[p1] - list2[p2]) } if (list1[p1] < list2[p2]) { p1++; } else { p2++; } }
- 它那个是