321
社区成员




给你一个 m x n 的矩阵 matrix ,请你返回一个新的矩阵 answer ,其中 answer[row][col] 是 matrix[row][col] 的秩。
这里定义的每个元素的 秩 是一个整数,表示这个元素相对于其他元素的大小关系,它按照如下规则计算:
(1)秩是从 1 开始的一个整数。
(2)如果两个元素 p 和 q 在 同一行 或者 同一列 ,那么: 如果 p < q ,那么 rank(p) < rank(q) 如果 p == q ,那么 rank(p) == rank(q) 如果 p > q ,那么 rank(p) > rank(q) 秩需要越小越好。
题目保证按照上面规则 answer 数组是唯一的。
参数说明: m == matrix.length n == matrix[i].length 1 <= m n <= 500 -10e9 <= matrix[row][col] <= 10e9
嗯,这个题目有点意思了,不过输入内容对 js 和 py 意外的语言不太友好,得自己切字符串转成数组,如果有 eval 则不用。
周赛未举行,暂不提供 AC 代码。
多做出一个矩阵,对应原矩阵,如果对应位置是该行列最小值,更新新矩阵对应值为1
如果新矩阵有剩余未更新值的点,遍历这些点,在对应行列未更新的所有数中为最小时,更新为已更新的秩的最大值加1
这就是一个暴力计算方式,65期周赛出现这个题目了,可惜老顾跑出去玩了,没参加周赛
arr = eval(input())
m,n = len(arr),len(arr[0])
ans = [[0] * n for _ in range(m)]
t = 0
for i in range(m):
for j in range(n):
v = arr[i][j]
row = sorted(set(arr[i]))
col = sorted(set([arr[x][j] for x in range(m)]))
ans[i][j] = (row.index(v),col.index(v))
if ans[i][j] == (0,0):
t += 1
ans[i][j] = 1
c = 0
while t < m * n:
cs = 0
for i in range(m):
for j in range(n):
v = ans[i][j]
if type(v) is int:
continue
if c not in v:
continue
row = [[x,j] for x in range(m) if type(ans[x][j]) is int]
col = [[i,x] for x in range(n) if type(ans[i][x]) is int]
row_less = [arr[x][j] for x in range(m) if type(ans[x][j]) is not int]
col_less = [arr[i][x] for x in range(n) if type(ans[i][x]) is not int]
if arr[i][j] > min(row_less + col_less):
continue
if len(row) + len(col) > 0:
cs += 1
t += 1
mn = sorted([[ans[x[0]][x[1]],arr[x[0]][x[1]]] for x in row] + [[ans[x[0]][x[1]],arr[x[0]][x[1]]] for x in col],key = lambda x:-x[0])
ans[i][j] = mn[0][0] + 1 if arr[i][j] != mn[0][1] else mn[0][0]
if cs == 0:
c += 1
print(ans)