2418. 按身高排序
https://leetcode.cn/problems/sort-the-people/
给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。
对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。
请按身高 降序 顺序返回对应的名字数组 names 。
思路:
给两个list,用zip按下标一对一组合,合并为一个二维list,按二维list中的第2列[1]大小排序,从大到小(反序)。需要返回数组 names,故*拆分,再zip重组 names heights。
题解:
class Solution:
def sortPeople(self, names: List[str], heights: List[int]) -> List[str]:
idx = list(map(list, zip(names, heights)))
idx.sort(key = lambda i:-i[1])
names, heights = zip(*idx)
return names
分析:
idx = list(map(list, zip(names, heights))):
zip(names, heights): 将两个列表 names heights 对应位置的元素组合成一个元组。例如,如果names=['John', 'Mary', 'Alice'],heights=[180, 165, 175],那么zip(names, heights)将生成一个元组列表 [('John', 180), ('Mary', 165), ('Alice', 175)]。
list(map(list, zip(names, heights))): 使用list函数与map函数,将上一步得到的元组转换为列表,得到最终的列表idx,其中每个元素是由名字和身高组成的列表。
两次list:第1次,map使用list函数把列表中元组逐个转化为列表,[ , ], [ , ], [ , ];第二次,将列表组合为列表,[[ , ], [ , ], [ , ]]
idx.sort(key = lambda i:-i[1]):
指定按身高降序排序,即高的在前面。(利用lambda排序的方法可见【2545. 根据第 K 场考试的分数排序】leetcode2545. 根据第 K 场考试的分数排序 – iAstralFloder)
names, heights = zip(*idx):
使用zip函数将排序后的idx列表进行拆分,分别赋值给names和heights两个变量(数组),实现将排序后的名字和身高分开。
1051.高度检查器
学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。
排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。
给你一个整数数组 heights ,表示 当前学生站位 的高度情况。heights[i] 是这一行中第 i 位学生的高度(下标从 0 开始)。
返回满足 heights[i] != expected[i] 的 下标数量 。
题解:
class Solution:
def heightChecker(self, heights: List[int]) -> int:
count = 0
expected = sorted(heights)
for i in range(len(heights)):
if heights[i] != expected[i]:
count += 1
return count
注意:
sorted()与sort()
for i in range(len(heights))的使用
count = 0 初始化