3Sum
Posted xpp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3Sum相关的知识,希望对你有一定的参考价值。
方法一:不进行夹逼,直接使用类似2Sum的方法,使用一个hashTable,键值对应vector中的数值,value对应vector对用数值的索引,这其中有一个小trick:最外层的循环需要出力重复数字,但是再深一层的循环判断重复数字时需要避开最外层循环的数字,如处理(-1, -1, 2)这种情况
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int> > result; if(nums.size() < 3) return result; sort(nums.begin(), nums.end()); unordered_map<int, int> hashTable; for(int i=0; i<nums.size(); ++i) hashTable[nums[i]] = i; for(int i=0; i<nums.size();++i) { if(i>0 && nums[i] == nums[i-1]) continue; for(int j=i+1; j<nums.size(); ++j) { if(j>(i+1) && nums[j] == nums[j-1]) continue; if((hashTable.find(-(nums[i] + nums[j])) != hashTable.end()) && (hashTable[-(nums[i] + nums[j])] > j)) { result.push_back({nums[i], nums[j], -(nums[i] + nums[j])}); } } } return result; } };
方法二,排序后夹逼
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int> > result; if(nums.size() < 3) return result; sort(nums.begin(), nums.end()); for(int i=0; i<nums.size()-2;++i) { if(i>0 && nums[i] == nums[i-1]) continue; int j=i+1; int k = nums.size()-1; while(j < k) { if(nums[j] + nums[k] > -nums[i]) { --k; } else if(nums[j] + nums[k] < -nums[i]) { ++j; } else { result.push_back({nums[i], nums[j], nums[k]}); --k; while(nums[k] == nums[k+1]) --k; ++j; while(nums[j] == nums[j-1]) ++j; } } } return result; } };
以上是关于3Sum的主要内容,如果未能解决你的问题,请参考以下文章