力扣练习之四数相加 II

我爱海鲸 2023-08-02 16:23:30 力扣、高级算法

简介高级、力扣、java、go、python、rust耗时统计

原题出处: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中出现过。如果出现过,将其频次累加到结果中。

运行时间比较:

你好:我的2025