15.三數之和
阿新 • • 發佈:2020-07-29
給你一個包含 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; }