😮454 4sum II

https://leetcode.com/problems/4sum-ii/

可以延申到k sum II,时间复杂度是O(n^(k/2)),思路是把数组们分成两半,算各自的sum的可能情况和出现频率,再结合到一起

class Solution {
    private int[][] allNums;
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        allNums = new int[][]{nums1, nums2, nums3, nums4};
        Map<Integer, Integer> left = sumCount(0, 1);
        Map<Integer, Integer> right = sumCount(2, 3);
        int ans = 0;
        for (int sum : left.keySet()) {
            ans += left.get(sum) * right.getOrDefault(-sum, 0);
        }
        return ans;
    }
    private Map<Integer, Integer> sumCount(int start, int end) {
        Map<Integer, Integer> cnt = new HashMap<>();
        // 初始状态,之后会像蜕壳一样更新
        cnt.put(0, 1);
        for (int i = start; i <= end; i++) {
            Map<Integer, Integer> tmpMap = new HashMap<>();
            int[] array = allNums[i];
            for (int total : cnt.keySet()) {
                for (int num : array) {
                    int newTotal = total + num;
                    // 记得加上之前已经有的newTotal的数量
                    tmpMap.put(newTotal, cnt.get(total) + tmpMap.getOrDefault(newTotal, 0));
                }
            }
            cnt = tmpMap;
        }
        return cnt;
    }
}

Last updated