Leetcode 15. 3つの数値の合計(ソート+ダブルポインター)

2021年3月3日水曜日天気は良い[過去を嘆いたり、現在を無駄にしたり、未来を恐れたりしないでください]



1.はじめに

リートコード15.3つの数字の合計
ここに画像の説明を挿入

2.問題解決(ソート+ダブルポインター)

主なアイデア:並べ替え+ダブルポインタ、難しさは重複を削除する方法です。

アルゴリズムの流れは次のとおりです。
ここに画像の説明を挿入

class Solution {
    
    
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
    
    
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        const int n = nums.size();
        for(int i=0;i<n;++i){
    
    
            // 特判(剪枝)
            if(nums[i]>0) return res;
            // 如果第一个元素重复,提前退出
            if(i>0 && nums[i]==nums[i-1]) continue;

            int beg = i+1, end = n-1;
            while(beg<end){
    
    
                if(nums[beg]+nums[end]==-nums[i]){
    
    
                    // 保存符合条件的三元组
                    res.push_back({
    
    nums[beg],nums[end],nums[i]});

                    // *重点:对第二个和第三个元素进行去重
                    while(beg<end && nums[beg]==nums[beg+1]) ++beg;
                    while(beg<end && nums[end]==nums[end-1]) --end;
                    ++beg;
                    --end;
                }
                else if(nums[beg]+nums[end]>-nums[i])
                    --end;
                else
                    ++beg;
            }
        }
        return res;
    }
};

参照

https://leetcode-cn.com/problems/3sum/solution/pai-xu-shuang-zhi-zhen-zhu-xing-jie-shi-python3-by/

おすすめ

転載: blog.csdn.net/m0_37433111/article/details/114329279