[LeetCode] 3Sum
来源:互联网 发布:移动宽带提速软件 编辑:程序博客网 时间:2024/06/17 19:08
问题:
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)
这道题的思路很简单:先将input排序,然后设置三个pointers:i, j, k,其中i从0到n-3;j从i+1开始递增;k从n-1开始递减(保持j恒大于k),然后算对应的三个数的sum。如果这个sum等于0,则就是我们要的答案;如果小于零,则j向后推一个;若大于零,则k向前推一个。
我第一次做犯的错误:
class Solution {public:vector<vector<int> > threeSum(vector<int> &num) {vector<vector<int> > result;if (num.size() < 3) return result;std::sort(num.begin(), num.end());for (int i = 0; i < num.size() - 2; i ++) {int j = i + 1;int k = num.size() - 1;while (j < k) {if (sum == 0) {vector<int> temp;temp.push_back(num[i]);temp.push_back(num[j]);temp.push_back(num[k]);result.push_back(temp);j ++;k --;}else if (sum > 0) k --;else j ++;}}return result;}};
这段代码的问题是:没有考虑到input中有可能有重复的数字出现。如果有重复的数字出现的话,那么上面这段代码返回的result里面就也有重复的triple。
改正(O(n^2)):
class Solution {public:vector<vector<int> > threeSum(vector<int> &num) {vector<vector<int> > result;if (num.size() < 3) return result;std::sort(num.begin(), num.end());for (int i = 0; i < num.size() - 2; i ++) {if (i != 0 && num[i] == num[i - 1]) continue;int j = i + 1;int k = num.size() - 1;while (j < k) {if (j > i+1 && num[j] == num[j - 1]) {j ++;continue;}if (k < num.size() - 1 && num[k] == num[k + 1]) {k --;continue;}int sum = num[i] + num[j] + num[k];if (sum == 0) {vector<int> temp;temp.push_back(num[i]);temp.push_back(num[j]);temp.push_back(num[k]);result.push_back(temp);j ++;k --;}else if (sum > 0) k --;else j ++;}}return result;}};
这样的话,只要发现是重复的,我们就continue,避免了上面说的问题。
0 0
- 【Leetcode】3Sum (Sum)
- Leetcode:2Sum,3Sum
- 【Leetcode】3Sum Closest (Sum)
- leetcode 2 sum 3sum 4sum
- Leetcode 2SUM-3SUM-4SUM
- Leetcode-2sum,3sum,4sum
- leetcode 2 sum & 3 sum & 4 sum
- [LeetCode] 2Sum, 3Sum, 4Sum, 3SUm closet
- [LeetCode] K sum(2Sum、3Sum、4Sum)
- leetcode--sum集合:2sum,3sum,4sum
- leetcode --- 2 sum , 3 sum , 4 sum , k sum problem
- LeetCode: 3Sum
- LeetCode: 3 Sum Closest
- leetcode - 3 Sum
- leetcode - 3 sum closest
- leetcode 3Sum
- leetcode 3Sum Closest
- LeetCode: 3Sum
- Spket Eclipse插件使用教程
- 关于zealer的mx3和小米3评测的一点看法
- C++编程规范之36:优先提供抽象接口
- 黑马程序员_ADO.NET学习
- 阅读 七周七语言
- [LeetCode] 3Sum
- 设计模式- 对象结构型模式小结
- C语言 - ACM题目:大爱数字7
- Android的onCreateOptionsMenu()创建菜单Menu详解
- OGRE roadmap to 1.9 and 2.0
- vc2010编译opencv2.4.6 【2】
- 叶黄素-
- BCB中char类型与AnsiString类型的相互转换
- IOS开发之UINavigationController详解