454. 四数相加 II

leetcode链接:
https://leetcode.cn/problems/4sum-ii/

分析

根据其数值大小的提示,不需要考虑数组越界的可能。

方法一:
暴力求解,其一定是可以做的,但是其时间复杂度为 n 的四次方,时间复杂度过高。

方法二:
初步引入哈希表,前三个数组循环,第四个数组放入到HashMap里面,判断其是否等于0。相较于方法一,时间复杂度有所下降,但是依然较高。

方法三: 看官方题解知
其将四个数相加分成了两个两个数相加,将数据对半分,然后将相加之后的相关结果放到HashMap中,然后判断两个map之间的数据。

方案一

初步引入哈希表,前三个数组循环,第四个数组放入到HashMap里面,判断其是否等于0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer, Integer> nums4Hash = new HashMap<>();
int n = nums1.length, result = 0;

for (int i = 0; i < n; i++) {
nums4Hash.put(nums4[i], i);
}

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
if (nums4Hash.containsKey(-(nums1[i] + nums2[j] + nums3[k])))
result++;
}
}
}

return result;
}
}

结果

运行失败:
Time Limit Exceeded

运行超时,时间复杂度过高。

分析

时间复杂度:
O( n 的三次方 )

空间复杂度:
O( n )

方案二

方法三: 看官方题解知
其将四个数相加分成了两个两个数相加,将数据对半分,然后将相加之后的相关结果放到HashMap中,然后判断两个map之间的数据。

https://leetcode.cn/problems/4sum-ii/solution/si-shu-xiang-jia-ii-by-leetcode-solution/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer, Integer> nums12Hash = new HashMap<>(), nums34Hash = new HashMap<>();
int n = nums1.length;
final int[] result = { 0 };
int temp12 = 0;
int temp34 = 0;

for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
temp12 = nums1[i] + nums2[j];
temp34 = -1 * (nums3[i] + nums4[j]);

if (nums12Hash.containsKey(temp12)) {
nums12Hash.replace(temp12, nums12Hash.get(temp12) + 1);
} else {
nums12Hash.put(temp12, 1);
}

if (nums34Hash.containsKey(temp34)) {
nums34Hash.replace(temp34, (nums34Hash.get(temp34) + 1));
} else {
nums34Hash.put(temp34, 1);
}
}
}

nums12Hash.forEach((k, v) -> {
if (nums34Hash.containsKey(k)) {
result[0] = result[0] + nums34Hash.get(k) * v;

}
});

return result[0];
}
}

结果

解答成功:
执行耗时:173 ms,击败了10.75% 的Java用户
内存消耗:42.8 MB,击败了11.38% 的Java用户

分析

时间复杂度:
O( n 的二次方 )

空间复杂度:
O( n 的二次方 )


454. 四数相加 II
http://yuanql.top/2023/06/12/02_leetcode/454. 四数相加 II/
作者
Qingli Yuan
发布于
2023年6月12日
许可协议