去掉最低工资和最高工资后的工资平均值

标签: 数组 排序

难度: Easy

给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。

请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。

示例 1:

输入:salary = [4000,3000,1000,2000]
输出:2500.00000
解释:最低工资和最高工资分别是 1000 和 4000 。
去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500

示例 2:

输入:salary = [1000,2000,3000]
输出:2000.00000
解释:最低工资和最高工资分别是 1000 和 3000 。
去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000

示例 3:

输入:salary = [6000,5000,4000,3000,2000,1000]
输出:3500.00000

示例 4:

输入:salary = [8000,9000,2000,3000,6000,1000]
输出:4750.00000

提示:

  • 3 <= salary.length <= 100
  • 10^3 <= salary[i] <= 10^6
  • salary[i] 是唯一的。
  • 与真实值误差在 10^-5 以内的结果都将视为正确答案。

Submission

运行时间: 18 ms

内存: 15.9 MB

class Solution:
    def average(self, salary: List[int]) -> float:
        n = len(salary)-2
        count = 0
        for i in salary:
            count += i
        return float((count-max(salary)-min(salary))/n)

Explain

此题解的思路是首先计算数组中所有工资的总和。然后,通过内置的max和min函数找到最高工资和最低工资,并从总和中减去这两个值。得到的结果再除以工资数组长度减去2(因为去掉了两个工资),即得到剩余工资的平均值。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def average(self, salary: List[int]) -> float:
        n = len(salary) - 2  # 去掉最高和最低工资后剩余的员工数量
        count = 0
        for i in salary:
            count += i  # 计算总工资
        # 计算去掉最高和最低工资后的总工资,并除以n得到平均值
        return float((count - max(salary) - min(salary)) / n)

Explore

在题解中选择遍历整个数组来单独计算总和,然后再使用max和min函数分别找到最大和最小值,这种方法更为直观且易于实现。但实际上,这并不是最高效的方法,因为它涉及到多次数组遍历。一次遍历同时计算总和、最大值和最小值是更优的做法,可以减少时间复杂度和提升性能。

如果数组 `salary` 只包含两个元素,按照题目要求去掉最高工资和最低工资后,数组将没有剩余元素。在这种情况下,`n` 将为0(`len(salary) - 2`)。尝试进行除以0的操作将引发运行时错误。代码需要增加一个检查,以确保 `n` 大于0,避免除零错误。

是的,可以通过一次遍历同时计算总和、找到最大值和最小值来优化性能。在一次遍历中维护三个变量:总和、当前最大值和当前最小值,可以有效地减少遍历次数,从而提高代码的效率。这种方法将整个处理的时间复杂度从O(2n)降低到O(n)。

在Python中,使用 `/` 运算符进行除法默认结果是浮点数,所以这里使用 `float` 类型转换实际上是多余的。无论输入的数据类型是什么(整数或浮点数),`/` 运算符都将输出浮点数,因此可以省略显式的 `float` 转换,简化代码。