题目:
从一个一维整型数组nums中找出所有能使x+y+z=0的解[x,y,z],并用一个二维数组输出。
思路:
给输入数组排序,然后遍历数组,把每次取出的元素作为可能解的最小元素x,在这个元素之后的序列中找能够使上式成立的所有(y,z)然后组合输出(x,y,z)。
代码:
#include <vector>
using namespace std;
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result; //声明两个数组,一个一维数组循环体内使用,一个二维数组输出用
vector<int> v(3,0);
if(nums.size()<3)return result; //输入数组长度小于3的情况,返回空数组
sort(nums.begin(),nums.end()); //给输入数组升序排序
if(nums[0]>0&&nums[nums.size()-1]<0)return result; //输入数组所有值都为正或都为负,返回空数组
int target,front,back,sum;
for(int i=0;nums[i]<=0;i++){ //for循环遍历以排序的数组,每次取出第i个元素nums[i]做为一个可能解的最小元素
target=-nums[i];
front=i+1; //nums[front]是nums[i]后的第一个元素
back=nums.size()-1; //nums[back]是nums的最后一个元素
while(front<back){ //在这个循环中找到使得sum=nums[front]+nums[back]+nums[i]等于0的一组front和back
sum=nums[front]+nums[back];
if(sum<target)front++;
else if(sum>target)back--;
else{
v[0]=nums[i]; //找到第一组后输入一维数组v,再将v输入二维数组result
v[1]=nums[front];
v[2]=nums[back];
result.push_back(v);
while(v[1]==nums[front])front++; //继续移动front,back,直到front比原来大,back比原来小,
while(v[2]==nums[back])back--; //然后进入下一轮while循环,试图找出下一对front,back使得sum等于0,
} //循环往复直到找出所有以nums[i]为最小元素的解
}
while(nums[i+1]==nums[i])i++; //判断nums[i+1]是否等于nums[i],由于上面的while循环找出了所有以nums[i]为最小元素的解,
} //若nums[i+1]==nums[i],则nums[i+1]没有寻找解的必要,跳过它
return result;
}