Leetcode 15. Sum(二分或者暴力或者哈希都可以)
Posted shanyr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 15. Sum(二分或者暴力或者哈希都可以)相关的知识,希望对你有一定的参考价值。
15. 3Sum
Medium
Given an array nums
of n integers, are there elements a, b, c in nums
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.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
题解: 三个数的和,思路就是求任意两个数的和x,然后O(n^2),再用O(1)的搜索搜索-x是否再数组内就可以了,O(1)搜索用哈希就行,或者用O(longn)的二分的方法也可以接收,我用的自带的find函数,最后也过了
1 class Solution 2 public: 3 vector<vector<int>> threeSum(vector<int>& nums) 4 multiset<int> left; 5 multiset<int> right; 6 set<vector<int>> ans; 7 int fl = 0; 8 for(int i = 0;i < nums.size(); i++) 9 if(nums[i] == 0) fl++; 10 else if(nums[i]<0) left.insert(nums[i]); 11 else if(nums[i]>0) right.insert(nums[i]); 12 13 set<int>:: iterator lit; 14 set<int>:: iterator rit; 15 for(lit = left.begin(); lit!=left.end(); lit++) 16 rit = lit; 17 rit++; 18 for(; rit != left.end(); rit++) 19 int tt = (*lit)+(*rit); 20 if(right.find(-tt)!=right.end()) 21 vector<int> New; 22 New.push_back( (*lit));New.push_back( (*rit));New.push_back( -tt); 23 ans.insert(New); 24 25 26 27 for(rit = right.begin(); rit!=right.end(); rit++) 28 lit = rit; 29 lit++; 30 for(; lit != right.end(); lit++) 31 int tt = (*lit)+(*rit); 32 if(left.find(-tt)!=left.end()) 33 vector<int> New; 34 New.push_back( -tt);New.push_back( (*rit));New.push_back( (*lit)); 35 ans.insert(New); 36 37 38 39 if(fl>=1) 40 set<int>:: iterator it; 41 for(it = left.begin(); it!=left.end(); it++) 42 if(right.find(-(*it))!=right.end()) 43 vector<int> New; 44 New.push_back((*it));New.push_back(0);New.push_back(-(*it)); 45 ans.insert(New); 46 47 48 49 if(fl>=3) 50 vector<int> New; 51 New.push_back(0);New.push_back(0);New.push_back(0); 52 ans.insert(New); 53 54 vector<vector<int>> finalans; 55 set<vector<int>>:: iterator i; 56 for(i = ans.begin(); i!=ans.end(); i++) 57 vector<int> t = (*i); 58 finalans.push_back(t); 59 60 return finalans; 61 62 ;
以上是关于Leetcode 15. Sum(二分或者暴力或者哈希都可以)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 367 有效的完全平方数[暴力 二分法] HERODING的LeetCode之路