【问题标题】:Rank all the elements in a matrix with respect to their row and column根据行和列对矩阵中的所有元素进行排名
【发布时间】:2019-07-18 05:54:57
【问题描述】:

假设我有一个矩阵(Python 中的二维列表),我想创建另一个矩阵,其中所有元素的排名基于它们所在的行和列。条件是:

  1. 排名应该从 1 开始
  2. 应为同一行或同一列中的相同元素提供相同的排名
  3. 如果根据特定的行或列排名,相同元素位于不同的行或列中,它们可能具有不同的排名
  4. 最大排名应尽可能小

假设给定的 5X5 矩阵为:

18, 25, 7, 11, 11
33, 37, 14, 22, 25
29, 29, 11, 14, 11
25, 25, 14, 14, 11
29, 25, 14, 11, 7

预期的输出是:

3, 4, 1, 2, 2
6, 7, 3, 4, 5
5, 5, 2, 3, 2
4, 4, 3, 3, 2
5, 4, 3, 2, 1

如何用 Python 或任何编程语言编写此代码,或者解决此问题的算法是什么?

【问题讨论】:

    标签: python matrix


    【解决方案1】:

    尝试使用这个嵌套列表推导:

    print([[sorted(set(i)).index(x) + 1 for x in i] for i in l])
    

    输出:

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

    【讨论】:

      【解决方案2】:

      从 Faruk Hossain 的回答中汲取灵感。您可以从创建元组开始。

      1. 为每个元素创建一个包含 (value, row_number, col_number) 的元组,并将它们存储在一个列表中。

      2. 按值升序对元组进行排序

      3. 现在基于每个元组的值进行迭代,从已经排名的元素(即值

      4. 还要注意,如果行和列的最大值恰好都等于当前元素的值,我们需要做一个额外的步骤,我们需要递归更新元素的等级相等。

      为了表示第四步的重要性,取矩阵

      3 2 4
      5 1 3
      2 6 4

      在这里,如果我们先填充底部 4,那么如果我们将其排名为 3,但接下来当我们将顶部行 4 排名为 4 时,我们会遇到矛盾。

      时间复杂度 - O(n^4)

      【讨论】:

        【解决方案3】:

        你可以用不同的方式来做到这一点。 我提供了一种简单的方法来做到这一点。

        步骤:

        1. 为每个元素创建一个包含 (value, row_number, col_number) 的元组,并将它们存储在一个列表中。
        2. 按值升序对元组进行排序
        3. 遍历列表。在每次迭代中,您都会得到一个tuple。对于每个tuple,现在您拥有该值的rowcolumn 编号。我们将排名这个位置(row, col)。迭代到当前的rowcolumn 并找到该行和列的 最大值 值。现在,当前位置的排名将在特定row and column + 1 (或在某些情况下为 0)之间最大你可以维护两个数组来优化这个搜索
        4. 按照前面的步骤,直到我们完成所有元素的任务。

        我在一次软件工程面试中被问到这个问题。

        【讨论】:

          猜你喜欢
          • 2019-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-12
          • 2020-11-19
          • 2017-06-17
          • 2020-11-04
          • 1970-01-01
          相关资源
          最近更新 更多