题解 | #牛牛的三元组问题#
牛牛的三元组问题
https://www.nowcoder.com/practice/72c6d735fb1144a2ba162976a4510839
1.考察知识点
数组、双指针
2.编程语言
C++
3.解题思路
该题为三数之和问题,针对三数之和问题,首先将数组进行排序;
然后,使用双指针方法,分别定义i,j,k三个指针,分别指向3个数字
按照数组顺序取第一个数字位置为i,第二个数字从i+1位置向后寻找,第三个数字从末尾向前遍历寻找
共有三种情况nums[i]+nums[j]+nums[k]==0,直接将i,j,k添加到返回数组中
nums[i]+nums[j]+nums[k]>0,k--
nums[i]+nums[j]+nums[k]<0,j--
分析重复情况,实现去重操作。
当i>0 && nums[i]==nums[i-1]时,跳过nums[i]
当k<n-1 && nums[k]==nums[k+1]时,跳过nums[k], k-1以后继续进行遍历
4.完整代码
#include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型vector<vector<>> */ vector<vector<int> > findTriplets(vector<int>& nums) { vector<vector<int>> res; // write code here int n = nums.size(); sort(nums.begin(),nums.end()); //取第一个数字 for(int i=0;i<n-2;i++) { //去除重复的第一个元素 if(i>0 && nums[i]==nums[i-1]) { continue; } //第二个元素每次从i+1向后寻找 int j = i+1; //第三个元素从n-1向前寻找 int k = n-1; //结束条件 while(j<k) { //去除重复的元素 if(k<n-1 && nums[k]==nums[k+1]) { k--; continue; } //找到以后添加到res二维数组中 if(nums[i]+nums[j]+nums[k]==0) { vector<int> tmp; tmp.push_back(nums[i]); tmp.push_back(nums[j]); tmp.push_back(nums[k]); res.push_back(tmp); j++; k--; } //如果和大于0,最大值减小 if (nums[i]+nums[j]+nums[k]>0){ k--; } //如果和小于0,最小值增大 if (nums[i]+nums[j]+nums[k]<0){ j++; } } } return res; } };