2418. 按身高排序
==Easy==
给你一个字符串数组 names
,和一个由 互不相同 的正整数组成的数组 heights
。两个数组的长度均为 n
。
对于每个下标 i
,names[i]
和 heights[i]
表示第 i
个人的名字和身高。
请按身高 降序 顺序返回对应的名字数组 names
。
示例 1:
输入:names = ["Mary","John","Emma"], heights = [180,165,170]
输出:["Mary","Emma","John"]
解释:Mary 最高,接着是 Emma 和 John 。
题解
新开一个数组 ,以序数对应 names
数组,值对应 height
数组。
用选择排序更新 height
的值,同时更新 idx[i]
的值。
最后更新 names
数组即可。
vector sortNames(vector& names, vector& heights) {
int n = heights.size(); // 记录人数
vector idx(n); // 建立长度为 n 的下标数组
for (int i = 0; i < n; i++) {
idx[i] = i; // 将下标数组初始化为 [0, 1, 2, ..., n-1]
}
// 选择排序 heights,并记录下标变化
for (int i = 0; i < n - 1; i++) { // 循环 n-1 次
int max_idx = i; // 记录身高最高的人的下标
for (int j = i + 1; j < n; j++) { // 从 i+1 的位置开始循环
if (heights[idx[max_idx]] < heights[idx[j]]) { // 如果出现更高的人
max_idx = j; // 更新最高的人的下标为 j
}
}
swap(idx[i], idx[max_idx]); // 将当前位置 i 和最高的人的位置 max_idx 进行交换
}
// 按顺序将 names 中的名字加入结果数组
vector res(n); // 建立长度为 n 的结果数组
for (int i = 0; i < n; i++) { // 循环 n 次
res[i] = names[idx[i]]; // 将原始 names 中对应下标的名字存入结果数组
}
return res; // 返回排序后的名字数组
}