Python程序:查找最近的房间


假设有一个名为`rooms`的数组,其中`rooms[i]`包含一个对[`roomId_i`, `size_i`],表示一个ID为`roomId_i`,大小为`size_i`的房间。所有房间号都是不同的。我们还有一个`queries`数组,其中`queries[j]`包含一个对[`preferred_j`, `minSize_j`]。第j个查询的答案是一个房间的房间号ID,满足以下条件:

  • 房间的大小至少为`minSize_j`,并且

  • |id - preferred_j|最小化。

如果绝对差值相同,则使用ID最小的房间。如果没有这样的房间,则返回-1。因此,我们必须找到一个名为`answer`的数组,其长度与`queries`相同,其中包含第j个查询的答案。

因此,如果输入类似于`rooms = [[2,2],[1,2],[3,2]] queries = [[3,1],[3,3],[5,2]]`,则输出将为`[3, -1, 3]`,因为:

  • 对于查询[3,1]:房间3是最接近的,因为|3 - 3| = 0,其大小2至少为1,所以答案是3。

  • 对于查询[3,3]:没有大小至少为3的房间,所以答案是-1。

  • 对于查询[5,2]:房间3是最接近的,因为|3 - 5| = 2,其大小2至少为2,所以答案是3。

为了解决这个问题,我们将遵循以下步骤:

  • 根据大小对`rooms`进行排序,如果大小相同,则根据房间ID排序。

  • queries = 一个由三元组(qid,size,i)组成的列表,其中i为索引,(qid, size)为queries中的对。

  • 根据大小反向排序`queries`,如果大小相同,则根据`preferred`排序,如果两者都相同,则根据索引排序。

  • ans := 一个与queries大小相同的数组,并用-1填充。

  • X := 一个新的列表。

  • 对于`queries`中的每个(qid, size, i),执行以下操作:

    • 当`rooms`不为空且`rooms`的最后一个元素的大小>= size时,执行以下操作:

      • (idr, p) := 从`rooms`中删除最后一个元素。

      • 插入idr后对X进行排序。

    • 如果X不为空,则:

      • j := 将qid插入X以保持X排序的索引。

      • 如果j等于X的大小,则:

        • ans[i] := X的最后一个元素。

      • 否则,如果j等于0,则:

        • ans[i] := X[0]

      • 否则:

        • 如果X[j] - qid < qid - X[j-1],则:

          • ans[i] := X[j]

        • 否则:

          • ans[i] := X[j-1]

  • 返回ans。

示例

让我们看看下面的实现以更好地理解。

import bisect
def solve(rooms, queries):
   rooms.sort(key = lambda x: (x[1], x[0]))
   queries = [(qid,size,i) for i, (qid, size) in enumerate(queries)]
   queries.sort(key = lambda x: (x[1], x[0], x[2]), reverse = True)
   ans = [-1] * len(queries)
   X = []
   for qid, size, i in queries:
      while rooms and rooms[-1][1] >= size:
         idr, _ = rooms.pop()
         bisect.insort(X, idr)
      if X:
         j = bisect.bisect(X, qid)
         if j == len(X):
            ans[i] = X[-1]
         elif j == 0:
            ans[i] = X[0]
         else:
            if X[j] - qid < qid - X[j-1]:
               ans[i] = X[j]
            else:
               ans[i] = X[j-1]
   return ans

rooms = [[2,2],[1,2],[3,2]]
queries = [[3,1],[3,3],[5,2]]
print(solve(rooms, queries))

输入

[[2,2],[1,2],[3,2]], [[3,1],[3,3],[5,2]]

输出

[3, -1, 3]

更新于:2021年10月8日

浏览量:137

开启你的职业生涯

完成课程获得认证

开始学习
广告