(每日一练)题目名称:求解秩矩阵

文盲老顾
WEB应用领新星创作者
博客专家认证
2023-07-05 14:24:35

给你一个 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 代码。

...全文
239 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2023-07-23
  • 打赏
  • 举报
回复 1

多做出一个矩阵,对应原矩阵,如果对应位置是该行列最小值,更新新矩阵对应值为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)

321

社区成员

发帖
与我相关
我的任务
社区描述
主要用于技术交流,包括但不限于 .net,mssql,js,css,python,算法,运维。也可以晒最新技术,美图,运动等。最后,如果有问题,可以提问,老顾能帮忙的会尽量帮忙哦。
前端sqlserverasp.net 技术论坛(原bbs) 北京·西城区
社区管理员
  • 文盲老顾
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧