leetcode
leetcode 3001 ~ 3050
数组的相对排序

数组的相对排序

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 15 ms, 内存: 16.0 MB


/*
 * 思路:
 * 1. 创建一个映射,记录arr2中每个元素的位置。
 * 2. 使用Java Stream对arr1中的元素进行排序:
 *    - 先根据arr2中的顺序排序,
 *    - 再根据自然顺序排序。
 */
import java.util.*;
import java.util.stream.*;

public class RelativeSortArrayStream {
    public int[] relativeSortArray(int[] arr1, int[] arr2) {
        Map<Integer, Integer> rank = IntStream.range(0, arr2.length)
                .boxed()
                .collect(Collectors.toMap(i -> arr2[i], i -> i));

        return Arrays.stream(arr1)
                .boxed()
                .sorted((a, b) -> {
                    if (rank.containsKey(a) && rank.containsKey(b)) {
                        return rank.get(a) - rank.get(b);
                    } else if (rank.containsKey(a)) {
                        return -1;
                    } else if (rank.containsKey(b)) {
                        return 1;
                    } else {
                        return a - b;
                    }
                })
                .mapToInt(i -> i)
                .toArray();
    }
}

解释

方法:

题解采用了计数排序的方法。首先创建一个频率数组,数组长度为arr1中最大元素加一,用于记录arr1中每个元素的出现次数。然后按照arr2的顺序,从频率数组中读取并构建结果数组,最后将剩余的未在arr2中出现的元素按照自然数顺序追加到结果数组的末尾。

时间复杂度:

O(n + m + max)

空间复杂度:

O(max)

代码细节讲解

🦆
题解中提到`按照arr2的顺序`,如果arr2中的元素在arr1中出现的顺序与arr2不同,这种情况下算法输出是否会受到影响?
算法的输出不会受到arr1中元素出现顺序的影响。算法设计的核心是根据arr2的顺序来确定元素在输出数组中的排序,因此只要arr2的顺序固定,无论arr1中的元素如何排列,其在结果数组中的相对顺序都将按arr2中的顺序来排列。计数排序部分只是记录了arr1中每个元素的出现次数,而arr2决定了这些元素输出时的顺序。
🦆
在构建频率数组时,为什么选择数组长度为`arr1中最大元素加一`而不是根据实际的元素种类数来定义长度?
选择`arr1中最大元素加一`作为频率数组的长度是因为这种方式可以直接利用元素的值作为数组索引,从而快速访问和更新元素的计数。这种方法简化了计数的过程,因为不需要额外的数据结构来映射元素到索引。如果基于实际的元素种类数来定义数组长度,则需要额外的映射机制来处理元素值和索引之间的关系,这可能会增加实现的复杂性并可能降低运行效率。
🦆
算法中提到`避免重复添加`通过将频率设置为0实现,这种方法是否最优,有没有更高效的处理方式?
在当前算法框架下,将频率设置为0来`避免重复添加`是一种简单而有效的方法,因为它直接在遍历arr2时修改频率数组,避免了后续重复处理已经添加到结果数组的元素。这种方法的效率已经很高,因为它仅涉及基本的数组操作。尽管存在其他方法,如使用额外的集合或映射来跟踪已处理的元素,但这些方法会增加额外的空间复杂度和可能的运行时间开销,因此,在大多数情况下,当前的方法提供了一个良好的效率和实现简易性的平衡。

相关问题