1. 程式人生 > 其它 >C++——求三數之和

C++——求三數之和

給你一個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c ,使得a + b + c = 0 ?請你找出所有和為 0 且不重複的三元組。

注意:答案中不可以包含重複的三元組。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/3sum

寫了一個效率極低的實現,備份以示警戒!

class Solution {

    struct Element
    {
        int value;
        int times;
        Element(int value, int times):value(value),times(times){};
    };
public: vector<vector<int>> threeSum(vector<int>& nums) { if(nums.size()<3) return {}; vector<vector<int>> rs; Element zero(0, 0); // zero vector<Element*> plusVec; // plus vector<Element*> minusVec; // minus
map<int, Element*> plusMap; // plus value to Element map map<int, Element*> minusMap; // minus value to Element map this->initElement(nums, zero, plusVec, minusVec, plusMap, minusMap); if(zero.times > 2) rs.push_back({0,0,0}); // {0, 0, 0} if(zero.times > 0
) // {0, minus, plus} { for(auto it=plusMap.begin(); it!=plusMap.end(); it++) { Element *element = it->second; if(minusMap.find(-element->value) == minusMap.end()) continue; rs.push_back({minusMap[-element->value]->value, 0, element->value}); } } appendElement(rs, minusVec, plusMap); // {minus, minus, plus} appendElement(rs, plusVec, minusMap); // {minus, plus, plus} return rs; } void initElement(vector<int>& nums, Element &zero, vector<Element*> &plusVec, vector<Element*> &minusVec, map<int, Element*> &plusMap, map<int, Element*> &minusMap) { for(int i=0; i<nums.size(); i++) { if(nums[i] == 0) { zero.times++; continue; } if(nums[i] > 0) { if(plusMap.find(nums[i]) == plusMap.end()) { Element *element = new Element(nums[i], 1); plusMap[element->value] = element; plusVec.push_back(element); } else (plusMap[nums[i]]->times)++; continue; } if(nums[i] < 0) { if(minusMap.find(nums[i]) == minusMap.end()) { Element *element = new Element(nums[i], 1); minusMap[element->value] = element; minusVec.push_back(element); } else (minusMap[nums[i]]->times)++; } } } void appendElement(vector<vector<int>> &rs, vector<Element*> &elementVec, map<int, Element*> &cmap) { for(int i=0; i<elementVec.size(); i++) // {minus, minus, plus} { Element *element = elementVec[i]; if(element->times>1 && cmap.find(-element->value*2) != cmap.end()) { rs.push_back({element->value, element->value, cmap[-element->value*2]->value}); } for(int j=i+1; j<elementVec.size(); j++) { Element *element2 = elementVec[j]; if(cmap.find(-element->value-element2->value) != cmap.end()) { rs.push_back({element->value, element2->value, cmap[-element->value-element2->value]->value}); } } } } };