題目描述:ios
給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出全部知足條件且不重複的三元組。數組
注意:答案中不能夠包含重複的三元組。測試
例如,給定數組 nums = [-1, 0, 1, 2, -1, -4],spa
知足要求的三元組集合爲:指針
[ [-1, 0, 1], [-1, -1, 2] ]code
方法一:哈希表blog
想法相似於兩數之和,在本題中,已知前兩個數,查找數組中是否存在-a-b排序
#include<iostream> #include<vector> #include<unordered_map> #include<algorithm> using namespace std; class Solution{ public: vector<vector<int>> threeSum(vector<int>& nums){ vector<vector<int>> result; if(nums.size() == 0) return result; sort(nums.begin(), nums.end()); //對數組排序是爲了後續去重 for(int i=0; i<nums.size(); ++i){ if(i!=0 && nums[i] == nums[i-1]) continue; unordered_map<int, int> map; for(int j=i+1; j<nums.size(); ++j){ if(map.find(-nums[i]-nums[j]) != map.end()){ result.push_back({nums[i], nums[j], -nums[i]-nums[j]}); while(j+1 < nums.size() && nums[j] == nums[j+1]) j++; } map.insert({nums[j], j}); } } return result; } }; int main(){ Solution solution; vector<int> vec; int i; do{ cin>>i; vec.push_back(i); }while(getchar() != '\n'); vector<vector<int>> result; result = solution.threeSum(vec); int rows = result.size(); int columns = result[0].size(); for(int i=0; i<rows; ++i) for(int j = 0; j<columns; ++j){ cout<<result[i][j]<<" "; } cout<<endl; return 0; }
方法一最後兩個測試用例沒有經過,超出時間限制three
方法二:雙指針法ci
首先必須對數組排序,排序後才能使用雙指針。遍歷整個數組,用i指向a所在的位置,而後固定a,用兩個指針指向b和c。移動b和c的位置,直至找到a+b+c=0
//雙指針 class Solution{ public: vector<vector<int>> threeSum(vector<int>& nums){ vector<vector<int>> result; if(nums.size() == 0) return result; sort(nums.begin(), nums.end()); for(int i=0; i<nums.size(); ++i){ if(i!=0 && nums[i-1]== nums[i]) //去重 continue; int j = i+1; int k = nums.size()-1; while(j < k){ if(nums[i] + nums[j] + nums[k] == 0){ result.push_back({nums[i], nums[j], nums[k]}); j++; k--; while(j<k && nums[j-1] == nums[j]) //去重 j++; while(j<k && nums[k+1] == nums[k]) //去重 k--; } else if(nums[i] + nums[j] +nums[k] < 0) j++; else k--; } } return result; } };