大餐计数
难度:
标签:
题目描述
代码结果
运行时间: 96 ms, 内存: 23.6 MB
/*
* 题目思路:
* 使用Java Stream和Collectors可以简洁地表达上面的算法。
* 主要思路与上面相同,依然是使用HashMap来记录出现过的美味程度的次数。
* 通过Stream的forEach遍历数组,并对每个元素计算其可能的美味程度之和,
* 并检查这些和是否在哈希表中。
* 最终结果依然需要对10^9+7取模。
*/
import java.util.HashMap;
import java.util.stream.IntStream;
public class Solution {
public int countPairs(int[] deliciousness) {
int MOD = 1000000007;
HashMap<Integer, Integer> map = new HashMap<>();
final int[] count = {0};
IntStream.of(deliciousness).forEach(val -> {
IntStream.rangeClosed(0, 21).forEach(i -> {
int powerOfTwo = 1 << i;
int complement = powerOfTwo - val;
count[0] = (count[0] + map.getOrDefault(complement, 0)) % MOD;
});
map.put(val, map.getOrDefault(val, 0) + 1);
});
return count[0];
}
}
解释
方法:
本题解使用哈希表记录每个美味程度的出现次数,然后针对每个可能的美味程度组合,计算它们的和是否是2的幂。为了快速判断和是否是2的幂,算法首先对美味程度进行排序,然后使用一个循环,其中外层循环遍历每个不同的美味程度,内层循环则尝试匹配使得两个美味程度之和达到下一个2的幂。如果当前的美味程度与其匹配的美味程度相同,则需要使用组合数计算方式计算配对数目。这种方法利用了数学的组合逻辑以及哈希表的高效性能来解决问题。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
在题解中提到使用哈希表来计数每个美味程度的出现次数,请问这种方法在处理大量重复值时的效率如何?
▷🦆
题解提到了对美味程度进行排序,然后使用双循环来找到和为2的幂的美味程度组合,为什么选择排序这一步是必要的?
▷🦆
题解中提到,当两个美味程度相同时,使用组合数计算方式来计算配对数目。能否详细解释这是如何实现的,以及在什么情况下需要这样处理?
▷🦆
题解中没有详细说明如何快速计算组合数,并对结果进行模运算(MOD = 1000000007)。在实现这一点时应注意哪些编程细节?
▷