Python程序:查找最多可放入其他盒子中的盒子数量


假设我们有一个盒子列表,其中每一行代表给定盒子的高度和宽度。如果第一个盒子小于第二个盒子(当它的宽度和高度都小于另一个盒子时),我们可以将一个盒子放入另一个盒子中,我们必须找到可以放入一个盒子中的最大盒子数。

因此,如果输入类似于

宽度
高度
12
12
10
10
6
6
5
10

则输出将为 3,因为我们可以将盒子 [6, 6] 放入 [10, 10] 中,该盒子可以放入 [12, 12] 盒子中。

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

  • 定义一个函数 insert_index()。这将获取 arr 和 this_h。
  • l := 0
  • r := arr 的大小 - 1
  • res := 0
  • 当 l <= r 时,执行以下操作
    • m := l +(r - l) // 2
    • cur_h := arr[m]
    • 如果 cur_h < this_h 不为零,则
      • res := m
      • l := m + 1
    • 否则,
      • r := m - 1
  • 返回 res + 1
  • 从主方法中,执行以下操作
  • 根据宽度对矩阵进行排序,如果宽度相同,则根据高度对其进行排序
  • n := 矩阵中项目的数量
  • heights := 一个大小为 (n + 1) 的列表,并将其填充为 inf
  • heights[0] := -inf
  • res := 0
  • 对于矩阵中的每个盒子,执行以下操作
    • [cur_w, cur_h] := 盒子
    • index := insert_index(heights, cur_h)
    • 如果 heights[index] >= cur_h,则
      • heights[index] := cur_h
    • res := res 和 index 的最大值
  • 返回 res

让我们看看以下实现以获得更好的理解:

示例

现场演示

class Solution:
   def solve(self, matrix):
      matrix = sorted(matrix, key=lambda x: (x[0], -x[1]))
      n = len(matrix)

      heights = [float("inf")] * (n + 1)
      heights[0] = float("-inf")
      res = 0

      for box in matrix:
         cur_w, cur_h = box
         index = self.insert_index(heights, cur_h)

         if heights[index] >= cur_h:
            heights[index] = cur_h
         res = max(res, index)
      return res

   def insert_index(self, arr, this_h):
      l = 0
      r = len(arr) - 1
      res = 0
      while l <= r:
         m = l + (r - l) // 2
         cur_h = arr[m]
         if cur_h < this_h:
            res = m
            l = m + 1
         else:
            r = m - 1
      return res + 1

ob = Solution()
matrix = [
   [12, 12],
   [10, 10],
   [6, 6],
   [5, 10]
]
print(ob.solve(matrix))

输入

matrix = [  
[12, 12],  
[10, 10],  
[6, 6],  
[5, 10] ]

输出

3

更新于: 2020年12月2日

962 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.