【LeetCode】15. 3Sum
2017-02-28 16:55
197 查看
【LeetCode】15. 3Sum
【题目描述】
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique tripletsin the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
【输入输出】
【解题思路】
1. 本题与Two Sum类似,只是由两个数的和拓展为三个数的和,其中一个区别是,Two Sum要求返回下标而本题要求返回值,这意味着可对vector进行排序。2. 去重:去除重复的元素,降低vector大小,此时注意a+a+b=0的情况,在去除重复元素的同时,若存在nums[i]=-2a时,应将[a, a, b]压入ans中,同时若存在三个或以上的零时也要将其压入ans。
3. 遍历:令i = [0, nums.size() - 3], from = i + 1, to = nums.size() - 1, 当from < to时,计算nums[i] + nums[from] + nums[to]的值,若等于零,将[nums[i], nums[from], nums[i]]压入ans, 若大于零,from++, 若小于零,to--,以此类推。
4. 进一步优化: 当nums[to] <0或者nums[i] > 0时可直接跳出当前循环。
【代码】
class Solution { public: vector<vector<int>> ans; vector<vector<int>> threeSum(vector<int>& nums) { ans.clear(); sort(nums.begin(), nums.end()); int lastN = INT_MAX, zeroC = 1; bool flag = true; for (vector<int>::iterator ite = nums.begin(); ite != nums.end();) { if (*ite == lastN) { ite = nums.erase(ite); if (lastN == 0) { zeroC++; continue; } vector<int>::iterator iter = find(nums.begin(), nums.end(), -2 * lastN); if (iter != nums.end() && flag) { if (lastN >= 0) { vector<int> node; node.push_back(*iter); node.push_back(lastN); node.push_back(lastN); ans.push_back(node); } else { vector<int> node; node.push_back(lastN); node.push_back(lastN); node.push_back(*iter); ans.push_back(node); } flag = false; } } else { lastN = *ite; ite++; flag = true; } } if (zeroC >= 3) { vector<int> node; node.push_back(0); node.push_back(0); node.push_back(0); ans.push_back(node); } if (nums.size() <= 2) return ans; for (int i = 0; i < nums.size() - 2 && nums[i] < 0; i++) { int from = i + 1; int to = nums.size() - 1; while (from < to && nums[to] > 0) { if (nums[from] + nums[to] + nums[i] > 0) to--; else if (nums[from] + nums[to] + nums[i] < 0) from++; else { vector<int> node; node.push_back(nums[i]); node.push_back(nums[from]); node.push_back(nums[to]); ans.push_back(node); from++; to--; } } } return ans; } };
相关文章推荐
- Leetcode15. 3Sum
- Leetcode 1. Two Sum & 15. 3Sum & 16. 3Sum Closest & 18. 4Sum
- leetcode 15. 3Sum
- LeetCode 15. 3Sum
- leetcode 15. 3Sum
- leetcode题解-15. 3Sum
- LeetCode 15. 3Sum
- LeetCode 15. 3Sum
- Leetcode 15. 3Sum
- Leetcode 15. 3Sum
- LeetCode 15. 3Sum
- leetcode 209. Minimum Size Subarray Sum
- LeetCode 437 Path Sum III
- [LeetCode] Sum of Two Integers(用位运算实现加法)
- leetcode 304. Range Sum Query 2D - Immutable 子矩阵求和 + DP
- Leetcode题解 303. Range Sum Query - Immutable
- [Leetcode]Sum Root to Leaf Numbers
- LeetCode Binary Tree Maximum Path Sum
- 1. Two Sum Leetcode Python New season for 2016
- leetcode:bits:Sum of Two Integers(371)