假设我有一个矩阵(Python中的2d列表),并且我想创建另一个矩阵,该矩阵具有基于它们所在的行和列的所有元素的排名。条件是:
假设给定的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或任何编程语言编写此代码,或者解决该问题的算法是什么?
答案 0 :(得分: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]]
答案 1 :(得分:0)
您可以用不同的方法来做。 我提供了一种简单的方法。
步骤:
tuple
。现在,对于每个tuple
,您都有该值的row
和column
号。然后,我们将排名(row, col)
。迭代到当前的row
,column
并找到该行和该列的 maximum 值。现在,当前职位的排名将在该特定row and column
+ 1 (在某些情况下为 0 )之间最高。 您可以维护两个数组以优化搜索。在软件工程采访中有人问我这个问题。
答案 2 :(得分:0)
从法鲁克·侯赛因的答案中汲取灵感。您可以从创建元组开始。
为每个元素创建一个具有(值,行编号,列编号)的元组,并将它们存储在列表中。
按值升序对元组进行排序
现在基于每个元组的值进行迭代,从已排名的元素(即value <= current value的元素)中的d列中找到最大排名的元素,现在将当前元素的值固定为这两个数的最大值,如果最大值不等于当前元素,则加1。
还请注意,如果行和列的最大值都恰好等于当前元素的值,那么我们需要执行一个附加步骤,我们需要递归更新等于的元素等级。
要表示第四步的重要性,请采用矩阵
3 2 4
5 1 3
2 6 4
在这里,如果我们首先填充底部4,然后将其排名为3,但是接下来将顶部4排名为4,则会产生矛盾。
时间复杂度- O(n ^ 4)