Leetcode2545:根据第 K 场考试的分数排序
题目描述:
班里有 m
位学生,共计划组织 n
场考试。给你一个下标从 0 开始、大小为 m x n
的整数矩阵 score
,其中每一行对应一位学生,而 score[i][j]
表示第 i
位学生在第 j
场考试取得的分数。矩阵 score
包含的整数 互不相同 。
另给你一个整数 k
。请你按第 k
场考试分数从高到低完成对这些学生(矩阵中的行)的排序。
返回排序后的矩阵。
代码思路:
- 获取输入数据的维度:
m = len(score)
:获取成绩列表(二维列表)的行数,即学生人数。n = len(score[0])
:获取成绩列表(二维列表)的列数,即每个学生的成绩科目数。
- 抽取出第
k
列的成绩:k_score = [score[i][k] for i in range(0, m)]
:使用列表推导式,从每个学生的成绩中抽取出第k
列的成绩,形成一个新列表k_score
。
- 创建成绩到索引的映射:
d1 = {value:idx for idx, value in enumerate(k_score)}
:创建一个字典d1
,键是第k
列的成绩值,值是该成绩值在原列表k_score
中的索引。这个映射用于后续根据排序后的成绩值找到原始的索引位置。
- 对第
k
列的成绩进行排序:k_score.sort()
:对列表k_score
进行升序排序。
- 创建排序后索引到成绩的映射:
d2 = {m - 1 - idx: value for idx, value in enumerate(k_score)}
:创建一个字典d2
,键是逆序的索引(即从大到小),值是排序后的成绩值。这里逆序是为了后续方便从排序后的索引找到原始索引。由于排序是升序,所以这里通过m - 1 - idx
转换为从大到小的索引,以便后续直接通过索引找到对应的原始成绩位置。
- 根据排序后的索引找到原始的学生成绩列表:
- 初始化一个空列表
ans
用于存放结果。 - 遍历排序后的索引(从0到
m-1
),通过d2[i]
获取排序后的成绩值,然后通过d1[d2[i]]
获取该成绩值在原始列表k_score
中的索引(即原始的学生索引)。 - 根据原始的学生索引,从原始的成绩列表
score
中取出相应的学生成绩列表,添加到结果列表ans
中。
- 初始化一个空列表
- 返回结果:
return ans
:返回排序后的学生成绩列表。
代码实现:
class Solution:
def sortTheStudents(self, score: List[List[int]], k: int) -> List[List[int]]:
# 获取行和列的长度
m = len(score)
n = len(score[0])
# 抽取出列的值
k_score = [score[i][k] for i in range(0, m)]
# 获取值对应的索引
d1 = {value:idx for idx, value in enumerate(k_score)}
# 排序
k_score.sort()
# 获取排序后对应的索引(注意排序是升序)
d2 = {m - 1 - idx: value for idx, value in enumerate(k_score)}
# 按照排序后的索引对应的值,寻找到原始值对应的序号
ans = []
for i in range(0, m):
ori_order = d1[d2[i]]
ans.append(score[ori_order])
return ans