0%

4-25每日

2418. 按身高排序

==Easy==

给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n

对于每个下标 inames[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; // 返回排序后的名字数组
}