LeetCode | 15. 3Sum(三数和为定值)
来源:互联网 发布:天津中年同志软件 编辑:程序博客网 时间:2024/06/03 22:02
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: 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]]
首先是自己写的代码,顺序枚举加二分查找,naive算法,复杂度O(n^2*log n),307/313 Accepted,剩下六个Case超时了,意料之中
class Solution {public: int array1[3] = {}, array2[3] = {}; bool cmp(vector<int> a,vector<int> b) { for(int i=0;i<3;i++) { array1[i] = a[i]; array2[i] = b[i]; } sort(array1,array1+3); sort(array2,array2+3); for(int i=0;i<3;i++) { if(array1[i] != array2[i]) { return false; } } return true; } vector<vector<int> > threeSum(vector<int>& nums) { vector<vector<int> > res; vector<int> tmp; int len = nums.size(); sort(nums.begin(),nums.end()); for(int i=0;i<len-1;i++) { for(int j=i+1;j<len;j++) { int t = nums[i]+nums[j]; int k = 0-t; int left = j+1, right = len-1, des = -1; while(left <= right) { int mid = (left+right)/2; if(nums[mid] == k) { des = mid; break; } else if(nums[mid] < k)//在右边 { left = mid+1; } else { right = mid; } if(left == right) { if(nums[left] == k) { des = left; } break; } } if(des != -1) { tmp.push_back(nums[i]); tmp.push_back(nums[j]); tmp.push_back(nums[des]); int flag = 0; for(int kk=0;kk<res.size();kk++)//判断是否有相同的三元组 { if(cmp(res[kk],tmp) == true) { flag = 1; } } if(flag == 0) { res.push_back(tmp); } tmp.clear(); } } } return res; }};
然后是O(N^2)的算法.看了Solution里面解法之后自己写的.对于前面的nums[i],在后面的数字中找到left和right使得nums[i]+nums[left]+nums[right] == 0.那么这里可以使用两个指针移动,一共是O(N).由于答案不允许出现重复的三元组,所以要过滤掉相同的元素,过滤方法如下面代码所示.
class Solution {public: vector<vector<int> > threeSum(vector<int>& nums) { vector<vector<int> > res; vector<int> tmp; int len = nums.size(); sort(nums.begin(),nums.end()); for(int i=0;i<len-2;i++) { int left = i+1, right = len-1; while(left < right) { int sum = nums[left]+nums[right]; if(sum+nums[i] < 0) { left++; } else if(sum+nums[i] > 0) { right--; } else if(sum+nums[i] == 0)//找到三元组 { tmp.push_back(nums[i]); tmp.push_back(nums[left]); tmp.push_back(nums[right]); res.push_back(tmp); //去除重复元素 while(left+1<len && nums[left]==tmp[1]) { left++; } while(right>=1 && nums[right-1]==tmp[2]) { right--; } tmp.clear(); } } while(nums[i] == nums[i+1]) { i++; } } return res; }};
1 0
- LeetCode | 15. 3Sum(三数和为定值)
- 1048. Find Coins (25) -- 二分法,寻找和为定值的两个数 (Two Sum - leetcode)
- Leetcode: 15. 3Sum 三数之和
- 【Leetcode 15】3Sum 三数和问题 C++
- 寻找和为定值的数
- LeetCode 15. 3Sum(三数之和)
- 寻找和为定值的两个数-三种解法
- leetcode-3sum 三数之和
- [LeetCode] 3Sum 三数之和 Python
- 算法总结(3)--k-Sum求和,找到和为定值的多个数
- LeetCode OJ-15.3Sum(三数和问题)
- LeetCode OJ-16.3Sum Closest(最接近三数和)
- LeetCode-15 3Sum(求3数和为零的情况总数)
- 3Sum(三数和)
- [Leetcode #1]Two Sum 从数组中找出和为特定值的两个数
- LeetCode 3Sum 三个数和为零的集合 C++完整程序
- CI19.11-和为定值的数对
- 寻找和为定值的两个数
- 从菜鸟到架构师(九)
- Java8特性总结以及Java的未来
- 第十三单元练习
- 支付功能----第三方支付公司
- LeetCode 142. Linked List Cycle II
- LeetCode | 15. 3Sum(三数和为定值)
- android sdk配置
- Java开发中的23种设计模式详解
- Python源码学习笔记 3 字符串对象
- Largest Rectangle in a Histogram POJ
- 关于JS的逻辑运算题之if的使用
- Hibernate总结笔记之三
- eclipse git 提交时提示 “There are no staged files”
- leetcode 230 Kth Smallest Element in a BST C++