Bootstrap

【LeetCode】统计特殊四元组Java题解

题目描述

给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 :

nums[a] + nums[b] + nums[c] == nums[d] ,且a < b < c < d

示例 1:

输入:nums = [1,2,3,6]
输出:1
解释:满足要求的唯一一个四元组是 (0, 1, 2, 3) 因为 1 + 2 + 3 == 6 。

示例 2:

输入:nums = [3,3,6,4,5]
输出:0
解释:[3,3,6,4,5] 中不存在满足要求的四元组。

示例 3:

输入:nums = [1,1,1,3,5]
输出:4
解释:满足要求的 4 个四元组如下:
- (0, 1, 2, 3): 1 + 1 + 1 == 3
- (0, 1, 3, 4): 1 + 1 + 3 == 5
- (0, 2, 3, 4): 1 + 1 + 3 == 5
- (1, 2, 3, 4): 1 + 1 + 3 == 5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-special-quadruplets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目统计特殊的四元组。题意简单明了,需要分别nums[a] + nums[b] + nums[c] == nums[d] ,且a < b < c < d 两个条件。

  • 首先,我们可以使用朴素解法得出这个题目的答案,观察朴素解法,发现有重复计算,时间复杂度较高。观察分析题目,我们可以采用倒序遍历,结合 hashmap, 可以减少一次循环。具体实现代码如下,供参考。

通过代码

  • 朴素解法

class Solution {
    public int countQuadruplets(int[] nums) {
        int ans = 0;
        int n = nums.length;
        if (n < 4) {
            return ans;
        }

        for (int i = 0; i < n - 3; i++) {
            for (int j = i + 1; j < n - 2; j++) {
                for (int k = j + 1; k < n - 1; k++) {
                    for (int m = k + 1; m < n; m++) {
                        if (nums[i] + nums[j] + nums[k] == nums[m]) {
                            ans++;
                        }
                    }      
                }
            }
        }

        return ans;
    }
}

  • 优化解法

class Solution {
    public int countQuadruplets(int[] nums) {
        int ans = 0;
        int n = nums.length;
        if (n < 4) {
            return ans;
        }
        Map map = new HashMap<>();
        for (int c = n - 2; c >= 2; c--) {
            map.put(nums[c + 1], map.getOrDefault(nums[c + 1], 0) + 1);
            for (int a = 0; a < c - 1; a++) {
                for (int b = a + 1; b < c; b++) {
                    int temp = nums[a] + nums[b] + nums[c];                      
                    ans += map.getOrDefault(temp, 0);
                }
            }

        }

        return ans;
    }
}

总结

  • 朴素解法的时间复杂度是O(n * n * n * n), 空间复杂度是O(1)

  • 优化解法的时间复杂度是O(n * n * n), 空间复杂度是O(n)

  • 坚持算法每日一题,加油!