# 923 - 3Sum With Multiplicity
這題算是 3 Sum 系列最猛的變形了,先來看看也是用 Two Pointer 的解法一。
解法一 - Two Pointer
演算法的概念如下:
class Solution {
public:
int threeSumMulti(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int count=0, n=nums.size(), MOD=(int)(1e9+7);
for(int i=0; i<n; i++) {
int l = i+1, r = n-1;
while(l < r) {
int sum = nums[i] + nums[l] + nums[r];
if(sum < target) {
l++;
}
else if(sum > target) {
r--;
}
else if(nums[l] != nums[r]){
int lnum=1, rnum=1;
while(l+1<r && nums[l+1] == nums[l]) {lnum++; l++;}
while(r-1>l && nums[r-1] == nums[r]) {rnum++; r--;}
count += lnum*rnum;
count %= MOD;
l++;
r--;
}
else {
// M = k - j + 1
// We contributed M * (M-1) / 2 pairs.
count += (r-l+1) * (r-l) / 2;
count %= MOD;
break;
}
}
}
return count;
}
};
解法二 - Hash Table
這個解法是參考 這篇討論,先記一下:
class Solution {
public:
int threeSumMulti(vector<int>& nums, int target) {
int ans = 0, mod = 1e9+7;
unordered_map<int, int> mp;
for(int i = 0; i < nums.size(); i++) {
ans = (ans + mp[target-nums[i]]) % mod;
for(int j = 0; j < i; j++) mp[nums[i]+nums[j]]++;
}
return ans;
}
};
Last updated