为了提高效率,先对数组进行排序。
在搜寻满足条件的组合时,可以进行剪枝操作,比如要找两个数使和为a,但开始查找的位置已经大于0 且大于a,那后面就没再必要进行搜寻了。
1 class Solution { 2 public: 3 vector<vector<int> > threeSum(vector<int>& nums) { 4 vector<vector<int> > result; 5 if (nums.size()<3) return result; 6 sort(nums.begin(), nums.end()); 7 8 for (int i=0;i<nums.size()-2 && nums[i]<=0;i++) { 9 if(i>0 && nums[i]==nums[i-1]) continue; 10 int target_two_sum = 0-nums[i], left_index=i+1, right_index=nums.size()-1; 11 while(left_index<right_index) { 12 if (nums[left_index]+nums[right_index] < target_two_sum) { 13 left_index++; 14 } else if (nums[left_index]+nums[right_index] > target_two_sum) { 15 right_index--; 16 } else { 17 vector<int> temp; 18 temp.push_back(nums[i]); 19 temp.push_back(nums[left_index]); 20 temp.push_back(nums[right_index]); 21 result.push_back(temp); 22 left_index++; 23 while(left_index<right_index && nums[left_index]==nums[left_index-1]) { 24 left_index++; 25 } 26 } 27 } 28 } 29 return result; 30 } 31 };