1.问题
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意: 答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
2.说明
输入说明:
首先输入n,表示输入n个整数
输入n个数组nums
输出说明:
输出所有能使得a+b+c=0的三个数的三元组
3.范例
输入范例:
6
-1 0 1 2 -1 -4
输出范例:
-1 0 -1
-1 -1 2
4.思路
使用双指针法进行解题,首先对数组进行排序
使用一层for循环,i遍历数组,当nums[i] >0时,后面的两个数和nums[i]相加一定也是>0,后面可以不再进行计算,因此直接返回reslut
同时定义下标left=i+1,right=nums.size()-1,即三元组nums[i] + nums[left] + nums[right]>0时,说明三数之和大于0,因排过序,因此,right往前移动,right--, 同理,若<0时,left++,直至left=right相遇为止
注意:题目中存在重复的元素,对于nums[i]==nums[i-1] 时,后面所计算的left和right同计算nums[i-1]的结果是一样的,因此需要进行去重!!!而且对a和b和c都需要进行去重!!!
5.代码
#include <iostream> #include <stdio.h> #include <algalgorithm> #include <vector> class Solution { vector<vector<int>> treeSum(vector<int> &nums) { vector<vector<int>> result; sort(nums.begin(),nums.end()); for(int i=0;i<nums.size();i++) { if(nums[i]>0) return result; //对a进行去重 if(i>0&&nums[i]==nums[i-1]) continue; int left=i+1; int right=nums.size()-1; while(left<right) { if(nums[i]+nums[left]+nums[right]>0) right--; else if(nums[i]+nums[left]+nums[right]<0) left++; else { result.push_back(vector<int>{nums[i],nums[left],nums[right]}); //去重逻辑应该放在找到一个三元组之后,对b 和 c去重 while(right>left&&nums[right]==nums[right-1]) right--; while(right>left&&nums[left]==nums[left+1]) left++; //找到答案时,双指针同时收缩 right--; left++; } } } return result; } }; int main() { //三数之和 int n; cin>>n; vector<int> nums; int data; for(int i=0;i<n;i++) { cin>>data; nums.push_back(data); } vector<vector<int>> res=Solution().treeSum(nums); for(int i=0;i<res.size();i++) { for(int j=0;j<3;j++) { cout<<res[i][j]<<" "; } cout<<endl; } return 0; }
标签:right,nums,int,三数,三元组,力扣,vector,left From: https://www.cnblogs.com/ohye/p/17726272.html