数组能形成多少数对
难度:
标签:
题目描述
代码结果
运行时间: 19 ms, 内存: 16.0 MB
/*
* 思路:
* 使用Java Stream API来实现上述逻辑。
* 1. 使用Collectors.groupingBy收集每个数字的出现次数。
* 2. 使用mapToInt和sum来计算可以形成的数对数量和剩余的元素个数。
*/
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
public class Solution {
public int[] numberOfPairs(int[] nums) {
// 使用Collectors.groupingBy收集每个数字的出现次数
Map<Integer, Long> countMap = Arrays.stream(nums)
.boxed()
.collect(Collectors.groupingBy(num -> num, Collectors.counting()));
int pairs = countMap.values().stream().mapToInt(count -> (int)(count / 2)).sum();
int leftover = countMap.values().stream().mapToInt(count -> (int)(count % 2)).sum();
return new int[]{pairs, leftover};
}
}
解释
方法:
首先,该题解通过使用Counter来统计nums中每个元素的出现次数。然后,初始化一个变量r用于记录最后数组中剩余的元素数量。对于Counter返回的每个值(即每个数字的出现次数),通过累加其除以2后的余数,即可得到未被配对的元素的数量。最后,返回结果数组,第一个元素是所有数字成对数(即(nums的总长度 - 剩余元素数量)除以2),第二个元素是剩余的单个数字的数量。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
题解中提到将每个数字的出现次数模2的余数累加以计算剩余元素的数量,这种方法为什么能准确地反映出无法配对的元素数?
▷🦆
在计算数对的总数时,为什么是用数组总长度减去剩余元素数量后再除以2,这样的计算方式是否总是准确无误?
▷🦆
Counter数据结构是如何帮助优化这个问题的解决方案的,它在这里的作用是什么?
▷🦆
如果输入数组`nums`为空,题解的方法是否仍然适用,算法会返回什么结果?
▷