vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
int len=nums.size();//若向量中的个数不变,可自设变量保存
for(int i=0;i+2<len&&nums[i]<=0;i++)//当nums向量中的个数为0时,i<nums.size()-2会出错,似乎此时右边是不能计算的,必须写出i+2<nums.size()
{
int first=i+1,last=len-1;
while(first<last)
{
int target=0-nums[i]-nums[first];
if(nums[last]>target) last--;
else if(nums[last]<target) first++;
else
{
vector<int> triplet(3, 0);//二维向量的添加,刚开始注意不能直接调用vector[0],越界
triplet[0] = nums[i];
triplet[1] = nums[first];
triplet[2] = nums[last];
result.push_back(triplet);
while(nums[first]==nums[first+1]) first++;//仅当找到一成功样例时,才判断是否跳过重复数字,不能放在括号外!
while(nums[last]==nums[last-1]) last--;
first++;last--;
}
}
while(i+1<len&&nums[i]==nums[i+1]) i++;
}
return result;
}
本题若可以用散列的方法,很明显就是O(n^2)的复杂度,但由于不知道数字范围,所以无法散列,若排序后二分查找,则是O(n^2*lgn)的复杂度,但不够快。在确定一个数字的情况下,从头尾同时双向遍历,最终仍为O(n^2)的复杂度。此时充分地利用了数理逻辑,减少不必要地查找。
但是,更麻烦地是,答案中会出现重复的情况,需要思考如何快速去重?