https://docs.google.com/document/d/1qxA2wps0IhVRWULulQ55W4SGPMu2AE5MkBB37h8Dr58/edit#
streets = [["a"],[],[],["b"]]
requirement = ["a", "b"]
最小的Window是1-4,但2, 3的距离都更短,所以应该是要最小的Window再Median? 不是很确定这样的作法是否涵盖了所有可能性,求哪位大神确认
(Provider: anonymous, 匹兹堡office)
第一题:
假设一条街上有多个block,一个block上有多个建筑。求一条街上离几个最近的特定建筑的最远距离最短的block。例子: street = [[“store”, “school”, “museum”], [“hospital”, “restaurant”], [“school”, “restaurant”], [], [“museum”]], requirement = [“store”, “museum”, “restaurant”].
第一个block到最近store是0,到最近museum是0,到最近restaurant是1,所以它的max是1
第二个block到最近store是1,到最近museum是1,到最近restaurant是0,所以它的max是1
第三个block到最近store是2,到最近museum是2,到最近restaurant是0,所以它的max是2
第四个block到最近store是3,到最近museum是1,到最近restaurant是1,所以它的max是3
第五个block到最近store是4,到最近museum是0,到最近restaurant是2,所以它的max是4
所以返回的block是第一个和第二个。
思路:遍历street建立map,key是建筑名字,value是list of integer存block index。然后再遍历一次street,对requirement中的每个建筑,找当前block是否在list里,如果在就删掉之前所有的index(???),如果不在就取最近的两个距离中的min。时间复杂度O(m*n),m为block个数,n为requirement个数。
(有没有更好的方法?)
用range做,相当于在一个string中找到包含所有指定字符的最短substring,在一个包含所有requirement的range中,range长度越短,max越小。
先遍历一次street,建立这样一个结构:unordered_map<string, set<int>>, 即给每种建筑建立一个有序表(二叉排序树);然后遍历block坐标,对每个坐标,在上面的哈希表里对每种建筑对应的排序树里二分找上下界,这样就能log复杂度计算到每种建筑的最近距离
streets = [["a"],[],[],["b"]]
requirement = ["a", "b"]
最小的Window是1-4,但2, 3的距离都更短,所以应该是要最小的Window再Median? 不是很确定这样的作法是否涵盖了所有可能性,求哪位大神确认
我觉得思路应该是对的,但是不确定是否是最好,对于你的例子来说,1对a, b做二分查找得到的是距离是(0, 3), 2对a,b做二分是(1,2),3是(2,1),4是(3,0),因此可以判断结果是2和3
这样的复杂度是(O(m * n + klogM) m 是街区个数,n是街区包含的建筑, k是requirements数