【LeetCode 每日一题】2465. 不同的平均值数目

161 阅读2分钟

2465. 不同的平均值数目

难度:简单

时间:2023/06/04


给你一个下标从 0  开始长度为 偶数  的整数数组 nums 。

只要 nums 不是  空数组,你就重复执行以下步骤:

  • 找到 nums 中的最小值,并删除它。
  • 找到 nums 中的最大值,并删除它。
  • 计算删除两数的平均值。

两数 a 和 b 的 平均值  为 (a + b) / 2 。

  • 比方说,2 和 3 的平均值是 (2 + 3) / 2 = 2.5 。

返回上述过程能得到的 不同  平均值的数目。

注意  ,如果最小值或者最大值有重复元素,可以删除任意一个。

示例 1:

输入:nums = [4,1,4,0,3,5]
输出:2
解释:
1. 删除 0 和 5 ,平均值是 (0 + 5) / 2 = 2.5 ,现在 nums = [4,1,4,3] 。
2. 删除 1 和 4 ,平均值是 (1 + 4) / 2 = 2.5 ,现在 nums = [4,3] 。
3. 删除 3 和 4 ,平均值是 (3 + 4) / 2 = 3.5 。
2.5 ,2.5 和 3.5 之中总共有 2 个不同的数,我们返回 2 。

示例 2:

输入:nums = [1,100]
输出:1
解释:
删除 1 和 100 后只有一个平均值,所以我们返回 1 。

提示:

  • 2 <= nums.length <= 100
  • nums.length 是偶数。
  • 0 <= nums[i] <= 100

解题思路:

对数组 nums 进行排序,随后使用两个指针,初始分别指向 nums首元素和尾元素对数组进行遍历,就可以不断得到当前数组的最大值和最小值。

由于「不同平均值的数目」和「不同和的数目」是等价的,因此在计算时,可以直接求出两个指针指向元素的和,代替平均值,避免浮点运算。只需要使用一个哈希集合,将所有的和添加进去,随后哈希集合中的元素个数即为答案。

class Solution {
    public int distinctAverages(int[] nums) {
        Arrays.sort(nums);
        Set<Integer> s = new HashSet<>();
        int n = nums.length;
        for (int i = 0; i < n >> 1; ++i) {
            s.add(nums[i] + nums[n - i - 1]);
        }
        return s.size();
    }
}

总结,也可以用排序+双指针的方法来做 首先对原始数组排序,接着使用双指针分别指向数组的头和尾。

使用一个哈希表存放最大数和最小数之和(因为问的是不同的平均数的数量,因此没必要除以2)

最终返回哈希表中原始的个数即可。

有时候,题目思路很简单,但是会对题目进行很强的包装,从而产生迷惑性,故此时需要好好分析题目的本质是什么。 持续更新leetcode每日一题和周赛的随机题目,如果有需要的题目需要题解,可以在评论区评论。 八月更文打卡回顾