923. 3Sum With Multiplicity 三数之和的排列组合
这一题和3Sum其实有点类似,作为一道衍生题,这一道题目允许出现重复的数字,但是要求index i,j,k需要是i<j<k的顺序。我们解题思路同样也是用哈希表来存储一个数字和出现次数的映射,分别用a,b来遍历哈希表,因为C可以通过target-a-b来得到。如果C不存在,则该组合不存在可以直接跳过。如果C存在,则分为三种情况,A = B = C, A = B != C, A != B != C. 这三种情况分别对应三种不同的排列组合,如果都相等,则是C(count,3),两个相同则是C(count,2) * countC,三个都不同则是countA * countB * countC。
来让我们看看代码吧
class Solution {
public int threeSumMulti(int[] arr, int target) {
long res = 0, mod = 1_000_000_007;
Map<Integer,Long> map = new HashMap<>();
for(int a: arr){
map.put(a,map.getOrDefault(a,0L)+1);
}
for(int a: map.keySet()){
System.out.println(a);
}
for(int a: map.keySet()){
for(int b:map.keySet()){
int c = target-a-b;
if(!map.containsKey(c))continue;
if(a == b && b == c){
res += map.get(a)* (map.get(a)-1) * (map.get(a)-2)/6;
}else if(a == b && b != c){
res += map.get(a) * (map.get(a)-1)/2 * map.get(c);
}else if(a < b && b < c){
res += map.get(a) * map.get(b) * map.get(c);
}
}
}
return (int)(res%mod);
}
}
最后不要忘取模