题目描述:
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
解析:
求三数之和为0的本质上是求两数之和为某一值,但是这两个数是不相等的,并且不是固定的,存在重复值。
首先通过对数组进行排序,固定三个数中的最小值,然后依次求得每一个数可能的两数之和。
主要思想:排序+双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { std::vector<std::vector<int>> result; std::sort(nums.begin(), nums.end()); int n = nums.size(); for(int i = 0; i<n; ++i){ if(i>0 && nums[i]==nums[i-1]){ continue; } int j = i + 1, k = n - 1; while(j<k){ int sum = nums[i] + nums[j] + nums[k]; if(sum>0) --k; else if(sum<0) ++j; else{ result.push_back({nums[i], nums[j], nums[k]}); for(++j; j<k&&nums[j] == nums[j-1]; ++j); for(--k; k>j&&nums[k] == nums[k+1]; --k); } } } return result; } };
|