Welcome to Subscribe On Youtube
3668. Restore Finishing Order
Description
You are given an integer array order of length n and an integer array friends.
ordercontains every integer from 1 tonexactly once, representing the IDs of the participants of a race in their finishing order.friendscontains the IDs of your friends in the race sorted in strictly increasing order. Each ID in friends is guaranteed to appear in theorderarray.
Return an array containing your friends' IDs in their finishing order.
Example 1:
Input: order = [3,1,2,5,4], friends = [1,3,4]
Output: [3,1,4]
Explanation:
The finishing order is [3, 1, 2, 5, 4]. Therefore, the finishing order of your friends is [3, 1, 4].
Example 2:
Input: order = [1,4,5,3,2], friends = [2,5]
Output: [5,2]
Explanation:
The finishing order is [1, 4, 5, 3, 2]. Therefore, the finishing order of your friends is [5, 2].
Constraints:
1 <= n == order.length <= 100ordercontains every integer from 1 tonexactly once1 <= friends.length <= min(8, n)1 <= friends[i] <= nfriendsis strictly increasing
Solutions
Solution 1: Custom Sorting
First, we build a mapping from the order array to record the finishing position of each ID. Then, we sort the friends array based on the finishing order of these IDs in the order array.
The time complexity is $O(n \times \log n)$, and the space complexity is $O(n)$, where $n$ is the length of the order array.
-
class Solution { public int[] recoverOrder(int[] order, int[] friends) { int n = order.length; int[] d = new int[n + 1]; for (int i = 0; i < n; ++i) { d[order[i]] = i; } return Arrays.stream(friends) .boxed() .sorted((a, b) -> d[a] - d[b]) .mapToInt(Integer::intValue) .toArray(); } } -
class Solution { public: vector<int> recoverOrder(vector<int>& order, vector<int>& friends) { int n = order.size(); vector<int> d(n + 1); for (int i = 0; i < n; ++i) { d[order[i]] = i; } sort(friends.begin(), friends.end(), [&](int a, int b) { return d[a] < d[b]; }); return friends; } }; -
class Solution: def recoverOrder(self, order: List[int], friends: List[int]) -> List[int]: d = {x: i for i, x in enumerate(order)} return sorted(friends, key=lambda x: d[x]) -
func recoverOrder(order []int, friends []int) []int { n := len(order) d := make([]int, n+1) for i, x := range order { d[x] = i } sort.Slice(friends, func(i, j int) bool { return d[friends[i]] < d[friends[j]] }) return friends } -
function recoverOrder(order: number[], friends: number[]): number[] { const n = order.length; const d: number[] = Array(n + 1).fill(0); for (let i = 0; i < n; ++i) { d[order[i]] = i; } return friends.sort((a, b) => d[a] - d[b]); }