本文最后更新于:2022年7月27日 晚上
题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
3刷 2022 07 27
- 排序
- while循环中去重,是对
nums[left]
和nums[right]
去重
- for循环最后也要去重,是对
nums[i]
去重
- while中的顺序,先保存三元组到res中,然后双指针收缩,再去重
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class Solution { public:
vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(), nums.end());
vector<vector<int>> res;
for (int i = 0; i < nums.size(); i++) { int t = nums[i]; int left = i + 1, right = nums.size() - 1;
while (left < right) { if (t + nums[left] + nums[right] > 0) right--; else if (t + nums[left] + nums[right] < 0) left++; else { vector<int> tmp = {t, nums[left], nums[right]}; res.push_back(tmp); left++; right--;
while (left < right && nums[left] == nums[left-1]) left++; while (left < right && nums[right] == nums[right+1]) right--; } }
while (i <= nums.size() - 1 - 1 && nums[i] == nums[i+1]) i++; } return res; } };
|
思路
将求 三数之和 转换为 求两数之和,先把数组排序,找第一个数x作为3数中的一个数字,后面只需要找到其他的2个数的和加上这个数x等于0就行。
即找到:a+b+x=0, a+b = -x, 令 sum = -x, 则求 a + b = sum
然后就是求2数之和等于sum了。使用双指针。
不过要注意重复元素的情况;有三种情况重复,
- nums[left]元素重复,left++后要判断元素是否重复;
- nums[right]元素重复,right–后要判断是否重复;
- nums[a]元素是否重复,要先判断num[a] == num[a+1]是否重复,再进行跳过重复元素的操作a++.
2刷 20220623
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 31 32 33 34 35 36
| class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> res;
sort(nums.begin(), nums.end());
for (int a = 0; a < nums.size(); a++) { int sum = -nums[a];
int left = a + 1; int right = nums.size() - 1; while (left < right) { if (nums[left] + nums[right] < sum) left++; else if (nums[left] + nums[right] > sum) right--; else if (nums[left] + nums[right] == sum) { vector<int> tmp = {nums[a], nums[left], nums[right]}; res.push_back(tmp); left++; right--; while (left < right && nums[left] == nums[left-1]) left++; while (left < right && nums[right] == nums[right+1]) right--; } }
while (a + 1 <= nums.size() - 1 && nums[a] == nums[a+1]) a++; }
return res; } };
|
1刷 20220622
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 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(), nums.end());
vector<vector<int>> res;
for (auto x : nums) cout << x << " "; cout << endl;
for (int a = 0; a < nums.size(); a++) { int sum = -nums[a];
int left = a + 1; int right = nums.size() - 1; while (left < right) { if (nums[left] + nums[right] < sum) left++; else if (nums[left] + nums[right] > sum) right--; else if (nums[left] + nums[right] == sum) { vector<int> tmp{nums[left], nums[right], nums[a]}; res.push_back(tmp); left ++; right --; while (left < right && nums[left] == nums[left-1]) left++; while (left < right && nums[right] == nums[right+1]) right--; } }
while (a + 1 < nums.size() && nums[a] == nums[a+1]) a++; }
return res; } };
|
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。