トピックリンク:こちらをクリックしてください
キーソリューションが出てマーキングを繰り返し、マップを削除することです。
日本語文、長さが少ない配列を超える場合 、リターン 。
配列をソートします。
最初の桁の列挙 、2桁を見つけるために二重ポインタ 及び
- もし :それはソートされているので、3に等しいが存在することはできず、数など 、終了します。
- 要素を繰り返す:複製ソリューションを避けるために、スキップ
左ポインタを作ります 、右ポインタ 、とき 、実行サイクル:
- とき 、実行サイクルか否か左境界と次の反復の右境界位置、重複除外ソリューションを決定します。そして同時に 次の位置に、新たなソリューションを探して
- 大きい場合は を示し、 すぎます、 左
- 未満の場合 を示し、 が小さすぎます、 右
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
int n = nums.size();
for(int i = 0; i < n; ++i)
{
if(nums[i] > 0) break; //若此处大于0,后面不可能找到负数了
if(i > 0 && nums[i] == nums[i-1]) continue; //去重
int pivot = -nums[i];
int L = i + 1, R = n - 1;
while(L<R)
{
if(nums[L]+nums[R]==pivot)
{
ans.push_back({nums[i],nums[L],nums[R]});
++L;
--R;
while(L < R && nums[L] == nums[L-1])
++L;
while(L < R && nums[R] == nums[R+1])
--R;
}
else if(nums[L]+nums[R] < pivot)
{
++L;
}
else
{
--R;
}
}
}
return ans;
}
};