1. 程式人生 > 實用技巧 >15.三數之和

15.三數之和

給你一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

示例:

給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

思路

先固定第一個數,再用雙指標確定後面兩個數。

    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(),nums.end());
        /*
        size_t為無符號數,如果nums.size()<2,則nums.size()-2會溢位,
        因此nums.size()必須強制轉換為int型別
        */
        for(int i=0;i<(int)nums.size()-2;++i){
            //剪枝操作:如果第一個數就大於0那麼三數之和肯定不為0
            if(nums[i]>0) break;
            //保證不包含重複三元組
            if(i>0&&nums[i]==nums[i-1]) continue;
            int l=i+1,r=nums.size()-1;
            //雙指標
            while(l<r){
                if(nums[l]+nums[r]==(-1)*nums[i]){
                    res.push_back({nums[i],nums[l],nums[r]});
                    //保證不包含重複二元組
                    while(l<r&&nums[l+1]==nums[l]) l++;
                    while(l<r&&nums[r]==nums[r-1]) r--;
                    l++;
                    r--;
                }
                else if(nums[l]+nums[r]<(-1)*nums[i]) l++;
                else r--;
            }
        }
        return res;
    }