leetcode
leetcode 1051 ~ 1100
删除某些元素后的数组均值

删除某些元素后的数组均值

难度:

标签:

题目描述

代码结果

运行时间: 27 ms, 内存: 16.1 MB


/*
 * 思路:
 * 1. 使用 Stream API 将数组转换为流并排序。
 * 2. 计算要删除的元素数量,即数组长度的5%。
 * 3. 删除最小和最大的元素,即删除排序后数组的前5%和后5%的元素。
 * 4. 计算剩余元素的平均值。
 */
import java.util.Arrays;
import java.util.stream.IntStream;

public class Solution {
    public double trimMean(int[] arr) {
        int n = arr.length;
        int removeCount = n / 20; // 5% 的元素数量
        return IntStream.of(arr)
                .sorted()
                .skip(removeCount)
                .limit(n - 2 * removeCount)
                .average()
                .orElse(0.0);
    }
}

解释

方法:

题解使用了Python的排序和切片功能来简化操作。首先,将数组排序,以确保可以方便地去除最小和最大的5%的元素。因为数组长度是20的倍数,所以可以通过整除20来直接得到5%元素的数量(记为n)。通过切片操作[arr[n:-n]],去除数组中的前n个(最小的)和后n个(最大的)元素。随后,使用sum函数计算剩余元素的总和,再除以剩余元素的数量(原数组长度的90%,即len(arr) - 2*n)来得到所需的平均值。

时间复杂度:

O(n log n)

空间复杂度:

O(n)

代码细节讲解

🦆
在确定删除最小5%和最大5%的元素时,如何处理数组长度不是20的倍数的情况?
如果数组长度不是20的倍数,计算5%元素的数量时应当使用向下取整(floor)来确定要删除的元素数量。例如,数组长度为100时,5%的元素数量为5,但如果数组长度为99,5%的计算结果为4.95,向下取整后为4。这样确保按照不超过5%的规则来删除元素。
🦆
排序后直接通过切片删除元素是否会影响原数组的结构,对此有什么具体的考虑么?
在Python中,使用sorted函数对数组进行排序时,会创建原数组的一个副本,所以原数组的结构不会被改变。使用切片操作也是在排序后的数组副本上进行,因此原数组的结构和内容保持不变。这种方法的好处是避免修改原数组,保持数据的原始性和完整性。
🦆
如果数组中存在多个相同的最小值或最大值,这种方法是否仍然准确地删除正确的元素数量?
这种方法通过简单地删除排序后数组两端的固定数量的元素,确保了删除的元素总数精确为数组长度的5%。如果数组中存在多个相同的最小值或最大值,这种方法依然会删除正确数量的元素,但可能会包括超过最严格定义的5%最小或最大元素的数量。这主要取决于数组中值的分布情况。
🦆
为什么在计算平均值时使用 len(arr) - 2 * n 而不是直接使用剩余元素的数量?
使用 len(arr) - 2 * n 实际上是直接使用剩余元素的数量来计算平均值。这里的 n 是数组长度除以20的结果,代表单边(即一端)需要删除的元素数量。所以,从数组中删除两端的元素后,剩余元素的数量就是 len(arr) - 2 * n。这是为了确保在计算平均值时,分母正确地反映了剩余元素的实际数量。

相关问题