You are given an array of strings names, and an array heights that consists of distinct positive integers. Both arrays are of length n.
For each index i, names[i] and heights[i] denote the name and height of the ith person.
Return names sorted in descending order by the people's heights.
Example 1:
Input: names = ["Mary","John","Emma"], heights = [180,165,170]
Output: ["Mary","Emma","John"]
Explanation: Mary is the tallest, followed by Emma and John.
Example 2:
Input: names = ["Alice","Bob","Bob"], heights = [155,185,150]
Output: ["Bob","Alice","Bob"]
Explanation: The first Bob is the tallest, followed by Alice and the second Bob.
Constraints:
n == names.length == heights.length
1 <= n <= 103
1 <= names[i].length <= 20
1 <= heights[i] <= 105
names[i] consists of lower and upper case English letters.
All the values of heights are distinct.
Solutions
Solution 1: Sorting
Thinking
With \(n\le 10^3\), sort names by descending height. Heights are unique, so the key is total. Sort indices by \(\textit{heights}\) descending, then emit \(\textit{names}[i]\).
According to the problem description, we can create an index array \(\textit{idx}\) of length \(n\), where \(\textit{idx}[i]=i\). Then we sort each index in \(\textit{idx}\) in descending order according to the corresponding height in \(\textit{heights}\). Finally, we traverse each index \(i\) in the sorted \(\textit{idx}\) and add \(\textit{names}[i]\) to the answer array.
We can also create an array \(\textit{arr}\) of length \(n\), where each element is a tuple \((\textit{heights}[i], i)\). Then we sort \(\textit{arr}\) in descending order by height. Finally, we traverse each element \((\textit{heights}[i], i)\) in the sorted \(\textit{arr}\) and add \(\textit{names}[i]\) to the answer array.
The time complexity is \(O(n \log n)\), and the space complexity is \(O(n)\), where \(n\) is the length of the arrays \(\textit{names}\) and \(\textit{heights}\).
Method 1 already sorts via an index array. Zipping height with name and sorting that pair descending removes the extra index array; the order is the same.