2465-不同的平均值数目

Raphael Liu Lv10

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

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

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

两数 ab平均值(a + b) / 2

  • 比方说,23 的平均值是 (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 首元素和尾元素对数组进行遍历,就可以不断得到当前数组的最大值和最小值。

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

代码

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int distinctAverages(vector<int>& nums) {
sort(nums.begin(), nums.end());
unordered_set<int> seen;
for (int i = 0, j = nums.size() - 1; i < j; ++i, --j) {
seen.insert(nums[i] + nums[j]);
}
return seen.size();
}
};
[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
class Solution:
def distinctAverages(self, nums: List[int]) -> int:
nums.sort()
seen = set()
i, j = 0, len(nums) - 1
while i < j:
seen.add(nums[i] + nums[j])
i += 1
j -= 1
return len(seen)
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
class Solution {
public int distinctAverages(int[] nums) {
Arrays.sort(nums);
Set<Integer> seen = new HashSet<Integer>();
for (int i = 0, j = nums.length - 1; i < j; ++i, --j) {
seen.add(nums[i] + nums[j]);
}
return seen.size();
}
}
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
public class Solution {
public int DistinctAverages(int[] nums) {
Array.Sort(nums);
ISet<int> seen = new HashSet<int>();
for (int i = 0, j = nums.Length - 1; i < j; ++i, --j) {
seen.Add(nums[i] + nums[j]);
}
return seen.Count;
}
}
[sol1-Go]
1
2
3
4
5
6
7
8
func distinctAverages(nums []int) int {
sort.Ints(nums)
seen := make(map[int]bool)
for i, j := 0, len(nums)-1; i < j; i, j = i + 1, j - 1 {
seen[nums[i] + nums[j]] = true
}
return len(seen)
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
var distinctAverages = function(nums) {
nums.sort((a, b) => a - b);
const seen = new Set();
for (let i = 0, j = nums.length - 1; i < j; i++, j--) {
seen.add(nums[i] + nums[j]);
}
return seen.size;
}
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int cmp(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}

int distinctAverages(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(int), cmp);
int seen[201] = {};
int count = 0;
for (int i = 0, j = numsSize - 1; i < j; i++, j--) {
int sum = nums[i] + nums[j];
if (!seen[sum]) {
seen[sum] = 1;
count++;
}
}
return count;
}

复杂度分析

  • 时间复杂度:O(n \log n),其中 n 是数组 nums 的长度。

  • 空间复杂度:O(n),即为哈希表需要使用的空间。

 Comments
On this page
2465-不同的平均值数目