LeetCode | 454 4sum-II

分析

四个相同大小的数组,从数组中各取一个元素,四者之和要与目标值相等,target是一个确定值。在两数之和这给问题中,num[j] = target - num[i],在这道题目中是否也可以使用这种思维来降低自由变量数量?

将四个数组一分为2,两个数组作为一个整体,就可以等价于两数之和的思路了。取两个数组,计算出里面所有的元素之和,并按照值进行归类,有点类似于缓存的概念。有了确定的目标值,有了确定的缓存,求解剩余两个数组的互补元素组合。

四数之和与两数之和不同在于,前者只关注数值,后者还要关注索引,前者更自由一些,不需要返回满足条件的与之对应的数组索引下标。

主类

package com.github.dolphinmind.hash;

import java.util.HashMap;
import java.util.Map;

/**
 * @author dolphinmind
 * @ClassName FourSumII
 * @description 四数相加
 * @date 2024/8/9
 */

public class FourSumII {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int res = 0;
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();

        // 统计两个数组中的元素之和,同时统计出现的次数,放入map中
        for (int outer : nums1) {
            for (int inner : nums2) {
                int sum = outer + inner;
                map.put(sum, map.getOrDefault(sum, 0)+1);
            }
        }

        // 统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数
        for (int outer : nums3) {
            for (int inner : nums4) {
                res += map.getOrDefault(0 - outer - inner, 0);
            }
        }

        return res;
    }
}

posted @ 2024-08-09 16:56  Neking  阅读(7)  评论(0编辑  收藏  举报