923. 3Sum With Multiplicityjava
题目大意:shell
给一个int数组A和一个目标值target,求知足下面两个条件的组合个数,其中i,j,k分别为数组的索引数组
思路:code
# step1 统计数组中每一个元素出现的次数 一个元素I出现的次数记为count(I) # step2 分类 记:I=A[i], J=A[j], K=A[k], C(count(I),3) 表示从count(I)个数中取3个的组合数 I=J=K C(count(I), 3) I=J!=K C(count(I), 2) * count(K) I!=J=K count(I) * C(count(K), 2) I!=J!=K count(I) * count(J) * count(K) # 复杂度 Time complexity: O(n + target^2) Space complexity: O(100)
下面是参考视频中的截图,其中的i,j,k是数而不是index视频
Java实现:blog
public int threeSumMulti(int[] A, int target) { int MOD = 1_000_000_007; // 由于最大数为10^9+7 // 计算数组中不一样元素出现的个数 由于 0 <= A[i] <=100 long[] c = new long[101]; // 定义成long,在计算中不用转换 for (int a : A) c[a]++; long ans = 0; for (int i = 0; i <= target; i++) { for (int j = i; j <= target; j++) { int k = target - i - j; if (k < 0 || k >= c.length || k < j) continue; if (c[i] == 0 || c[j] == 0 || c[k] == 0) continue; if (i ==j && j == k) { ans += (c[i] - 2) * (c[i] - 1) * c[i] / 6; } else if (i ==j && j != k) { ans += c[i] * (c[i] - 1) / 2 * c[k]; } else if (i != j && j == k) { ans += c[i] * (c[j] - 1) * c[j] / 2; } else { ans += c[i] * c[j] * c[k]; } ans %= MOD; } } return (int)ans; }