leetcode2418. 按身高排序,1051.高度检查器

2418. 按身高排序

https://leetcode.cn/problems/sort-the-people/

给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。
对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。
请按身高 降序 顺序返回对应的名字数组 names 。

image

思路:
给两个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.高度检查器

1051. 高度检查器

学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。
排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。
给你一个整数数组 heights ,表示 当前学生站位 的高度情况。heights[i] 是这一行中第 i 位学生的高度(下标从 0 开始)。
返回满足 heights[i] != expected[i] 的 下标数量 。

image

题解:

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 初始化

发表评论