leetcode.15-----------3Sum
来源:互联网 发布:php防止恶意注册 编辑:程序博客网 时间:2024/06/06 21:39
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)
思路:
the key idea is the same as the TwoSum
problem. When we fix the 1st
number, the 2nd
and3rd
number can be found following the same reasoning as TwoSum
.
The only difference is that, the TwoSum
problem of LEETCODE has a unique solution. However, in ThreeSum
, we have multiple duplicate solutions that can be found. Most of the OLE errors happened here because you could've ended up with a solution with so many duplicates.
The naive solution for the duplicates will be using the STL methods like below :
std::sort(res.begin(), res.end());res.erase(unique(res.begin(), res.end()), res.end());
But according to my submissions, this way will cause you double your time consuming almostly.
A better approach is that, to jump over the number which has been scanned, no matter it is part of some solution or not.
If the three numbers formed a solution, we can safely ignore all the duplicates of them.
We can do this to all the three numbers such that we can remove the duplicates.
Here's my AC C++ Code: Runtime: 62 ms
class Solution {public: vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int> > res; std::sort(num.begin(), num.end()); for (int i = 0; i < num.size(); i++) { int target = -num[i]; int front = i + 1; int rear = num.size() - 1; while (front < rear) { int sum = num[front] + num[rear]; // Finding answer which start from number num[i] if (sum < target) front++; else if (sum > target) rear--; else { vector<int> triplet(3, 0); triplet[0] = num[i]; triplet[1] = num[front]; triplet[2] = num[rear]; res.push_back(triplet); // Processing duplicates of Number 2 // Rolling the front pointer to the next different number forwards while (num[front] == triplet[1] && front < rear) front++; // Processing duplicates of Number 3 // Rolling the rear pointer to the next different number backwards while (num[rear] == triplet[2] && front < rear) rear--; } } // Processing duplicates of Number 1 while (i + 1 < num.size() && num[i + 1] == num[i]) i++; } return res; }};
- 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-15 3Sum
- 3Sum - LeetCode 15
- Leetcode #15 3 Sum
- LeetCode---(15) 3 sum
- LeetCode 15 - 3Sum
- leetcode-15 3sum
- leetcode 15 -- 3Sum
- Leetcode[15]-3Sum
- LeetCode 15: 3 Sum
- [Leetcode]Roman to Integer
- 笔记:javascript通过反射和遍历,访问对象的所有属性,及 按引用/按值传递
- hdu1114 Piggy-Bank(附装满背包初始化的理解)
- Android笔记十九.Bitmap之简易图片查看器
- Hive之压缩存储
- leetcode.15-----------3Sum
- 排列组合的输出
- 杭电1197
- Qt5学习笔记(7)——组合框QGroupBox类
- 顺序表的应用举例(利用顺序表的基本运算,实现如果在顺序表A中出现的元素,在顺序表B中也出现,则将A中该元素删除)
- HDU--1251统计难题【字典树】
- 多个datawindow在同一个事物中保存数据
- 1061. Dating (20)
- 类模板与static成员