欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > Leetcode:15.三数之和

Leetcode:15.三数之和

2025/2/26 0:37:26 来源:https://blog.csdn.net/2401_88475903/article/details/144009998  浏览:    关键词:Leetcode:15.三数之和

这道题是一道双指针解决的例题,从字面上看,能想到的暴力解法就是三重循环,但是如果数据量过大的时候,时间复杂度会很高,所以我们要想办法减少循环次数,第二个循环和第三个循环都是在前一个循环的基础上对后面的数进行遍历,所以我们可以将第二个循环和第三个循环合并成一个循环,在我们确定第二个元素之后,我们只需要移动三个元素,来看三个数是否符合要求,这里我们设置一个变量target = -nums[i] (i为第一个元素的下标) 这样就变成了一个两数之和。

另外题目要求我们不能有重复的三元组,所以我们可以对所给数组进行排序+当前元素与前一个元素进行比较,这样就保证了不会有重复的三元组

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n = nums.size();sort(nums.begin(),nums.end());vector<vector<int>> vec;for(int i = 0;i < n-2;i++){int x = nums[i];if (x + nums[i + 1] + nums[i + 2] > 0) break; if (x + nums[n - 2] + nums[n - 1] < 0) continue; if(i>0&&nums[i]==nums[i-1]){continue;}int k = n-1,target = -nums[i];for(int j = i + 1;j < n-1;j++){if(j>i+1&&nums[j]==nums[j-1]){continue;}while(j<k&&nums[j]+nums[k]>target){k--;}if(j==k) break;if(nums[j]+nums[k]==target){vec.push_back({nums[i],nums[j],nums[k]});}}}return vec;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com