首页 > 代码库 > 3Sum
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。