LeetCode-3Sum
来源:互联网 发布:雨花区软件谷 编辑:程序博客网 时间:2024/06/10 08:02
解法一:三重循环遍历,加上少许优化,虽然运行效果尚可,但复杂度是O(n^3),偏高
class Solution {public: vector<vector<int> > threeSum(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > vec; sort(num.begin(), num.end()); //第一个非负数的位置,用于循环条件优化 vector<int>::size_type posZero = num.size(); for (vector<int>::size_type i = 0; i < num.size(); ++i) { if (num[i] >= 0) { posZero = i; break; } } if (posZero == num.size()) { return vec; } for (vector<int>::size_type i = 0; i < num.size() - 2; ++i) { //第一个数就是正数,则一定不是解 if (num[i] > 0) { break; } //第一个数与前一个数相同,属于重复情况,跳过 if (i > 0 && num[i] == num[i - 1]) { continue; } for (vector<int>::size_type j = i + 1; j < num.size() - 1; ++j) { //前两个数之和大于0,不是解 if (num[i] + num[j] > 0) { break; } vector<int>::size_type k = max(j + 1, posZero); for (; k < num.size(); ++k) { int sum3 = num[i] + num[j] + num[k]; if (sum3 == 0) { vector<int> vec1; vec1.push_back(num[i]); vec1.push_back(num[j]); vec1.push_back(num[k]); if (vec.size() != 0) { //检验是否是重复解 vector<int> last = vec[vec.size() - 1]; if (vec1 != last) { vec.push_back(vec1); } } else { vec.push_back(vec1); } } else if (sum3 > 0) { break; } } } } return vec; }};
解法二:只须二重循环,外层循环选定一个数,内层循环同时指定两个数进行试探,复杂度为O(n^3)
class Solution {public: vector<vector<int> > threeSum(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > vec; if (num.size() < 3) return vec; sort(num.begin(), num.end()); for (vector<int>::size_type i = 0; i < num.size() - 2; ++i) { if (num[i] > 0) break; int j = i + 1, k = num.size() - 1; while (j < k) { if (num[i] + num[j] > 0) break; if (num[j] + num[k] < -num[i]) ++j; else if (num[j] + num[k] > -num[i]) --k; else { vector<int> vec1; vec1.push_back(num[i]); vec1.push_back(num[j]); vec1.push_back(num[k]); vec.push_back(vec1); //去重 while (j < k && num[j] == num[j + 1]) ++j; while (k > j && num[k] == num[k - 1]) --k; ++j; --k; } } //去重 while (i < num.size() - 2 && num[i + 1] == num[i]) ++i; } return vec; }};
- 【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
- 2013 whu暑假集训选拔#3
- POJ 1007
- linux内核链接脚本详解
- BUAA-SCSE Training day2
- hdu 题目分类
- LeetCode-3Sum
- 【操作符】 - 数据类型,直接常量
- maven常用命令
- Struts2+Hibernate3+Spring3简单整合练习
- 测试
- IOS如何调用WebService? .
- 编译错误:errno undeclared的解决
- AJAX缩写
- 队列-数组队列实现-DTU缓冲区原型.c