原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-hard/xwqm6c/
解法一(python)
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
count = 0
count_table = defaultdict(int)
for n1 in nums1:
for n2 in nums2:
count_table[n1+n2] += 1
for n3 in nums3:
for n4 in nums4:
count += count_table[-(n3+n4)]
return count
解法二(rust)
use std::collections::HashMap;
impl Solution {
pub fn four_sum_count(nums1: Vec<i32>, nums2: Vec<i32>, nums3: Vec<i32>, nums4: Vec<i32>) -> i32 {
let mut count = 0;
let mut count_table: HashMap<i32,i32> = HashMap::new();
for n1 in &nums1 {
for n2 in &nums2 {
*count_table.entry(n1+n2).or_insert(0) += 1;
}
}
for n3 in &nums3 {
for n4 in &nums4 {
count += count_table.get(&-(n3+n4)).unwrap_or(&0);
}
}
count
}
}
解法三(go)
func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
count := 0
sumTable := make(map[int]int)
// 计算 nums1 和 nums2 数组中元素之和的频次
for _, num1 := range nums1 {
for _, num2 := range nums2 {
sum := num1 + num2
sumTable[sum]++
}
}
// 遍历 nums3 和 nums4 数组,查找其相反数在哈希表中出现的频次
for _, num3 := range nums3 {
for _, num4 := range nums4 {
sum := num3 + num4
count += sumTable[-sum]
}
}
return count
}
解法四(java)
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
int count = 0;
Map<Integer, Integer> sumTable = new HashMap<>();
// 计算 nums1 和 nums2 数组中元素之和的频次
for (int num1 : nums1) {
for (int num2 : nums2) {
int sum = num1 + num2;
sumTable.put(sum, sumTable.getOrDefault(sum, 0) + 1);
}
}
// 遍历 nums3 和 nums4 数组,查找其相反数在哈希表中出现的频次
for (int num3 : nums3) {
for (int num4 : nums4) {
int sum = num3 + num4;
count += sumTable.getOrDefault(-sum, 0);
}
}
return count;
}
}
思路:
使用map来记录每个数组中元素之和的频次。首先,我们遍历 nums1 和 nums2 数组,将两个数组中所有元素之和及其出现次数存储在map中。
然后,我们再次遍历 nums3 和 nums4 数组,计算 nums3[k] + nums4[l] 的相反数,看它是否在map中出现过。如果出现过,将其频次累加到结果中。
运行时间比较: