题目来源: 2418. 按身高排序
题目描述:
- 描述: 给你一个字符串数组 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的身高 。
示例2:
输入:names = ["Alice","Bob","Bob"], heights = [155,185,150]
输出:["Bob","Alice","Bob"]
- 解释:在这三个人中,第一个Bob的身高是最高的,接着是 Alice的身高,最低的是第二个Bob的身高 。
思路
思路1 我们可以将names[i] 和heights[i] 绑定为一个二元组,然后对所有的二元组按照heights 排序。最后取出其中的names 即为答案。
除了以上这个方法,我们还可以创建一个索引数组indices,其中indices[i]=i。排序完成后,对于所有的i,j (i<j) 都有heights[indices[i]]>heights[indices[j]]。然后我们遍历i 从0 到n−1,将names[indices[i]] 追加到答案数组中。
具体实现1
class Solution {
public String[] sortPeople(String[] names, int[] heights) {
int n = names.length;
Integer[] indices = new Integer[n];
for (int i = 0; i < n; i++) {
indices[i] = i;
}
Arrays.sort(indices, (a, b) -> heights[b] - heights[a]);
String[] res = new String[n];
for (int i = 0; i < n; i++) {
res[i] = names[indices[i]];
}
return res;
}
}
复杂度分析1:
- 时间复杂度:O(nlogn),其中n 代表的是names 和heights 的长度。对indices 数组进行排序的时间复杂度为O(nlogn)。
- 空间复杂度:O(n),其中n 代表的是names 和heights 的长度。排序过程中所需要的栈空间为O(logn),创建indices 数组所需要的空间是O(n),对它们求和后空间复杂度渐进意义下等于O(n)。