15.三数之和(LeetCode热题100)
- 游戏开发
- 2025-08-27 12:33:01

题目来源:
15. 三数之和 - 力扣(LeetCode)
题目内容:
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 解释: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。 nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。 nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。 注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1] 输出:[] 解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0] 输出:[[0,0,0]] 解释:唯一可能的三元组和为 0 。
思路分析:
与采用双指针(相反方向)进行扫描类似,不过多了一个指针变成三指针
代码实现: class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { ranges::sort(nums); int n = nums.size(); vector<vector<int>> ans; // 保存结果的数组,最后要去除重复 for (int i = 0; i < n - 2;i++) { // 这里n-2是因为,三数字之和,i后面已经有了两个数字 int j = i + 1; int k = n - 1; int temp = nums[i]; if (i>0&&temp == nums[i - 1]) // 对k去除重复 continue; while (j < k) { int add = temp + nums[j] + nums[k]; if (add > 0) k--; else if (add < 0) j++; else { // 三数字之和为0 ans.push_back({temp, nums[j], nums[k]}); // 再次去重 对j&&k for (j++; j < k && nums[j] == nums[j - 1]; j++) ; for (k--; k > j && nums[k] == nums[k + 1]; k--) ; } } } return ans; } };
题目心得:
ranges::sort(nums); //sort排序这里要这样写
for (k--; k > j && nums[k] == nums[k + 1]; k--) ;//这个方法要积累一下
体会这道题里面蕴含的《双指针排序算法》的思想。准确来说是三指针,开头的i,排在第二的j=i+1,已经由尾向头的k=n-1
15.三数之和(LeetCode热题100)由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“15.三数之和(LeetCode热题100)”