题解 | #三数之和#

三数之和

https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

#include <cstddef>
#include <set>
#include <unordered_map>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param num int整型vector
     * @return int整型vector<vector<>>
     */


    vector<vector<int> > threeSum(vector<int>& num) {
        // write code here
        unordered_map<int, int> has;
        if (num.size() < 3) {
            return {};
        }
        for (int k = 0; k < num.size(); k++) {

            has[num[k]]++;
            // cout<<num[k]<<":"<<has[num[k]]<<" ";
        }

        vector<vector<int>>m;
        // sort(num.begin(), num.end());
        for (int i = 0; i < num.size(); i++) {
            for (int j = 1; j < num.size(); j++) {
                if (i != j) {
                    int n = num[i] + num[j];
                    // cout<<"i->"<<num[i]<<"j->"<<num[j]<<" -i-j-> "<<-n<<" ";
                    has[num[i]]--;
                    has[num[j]]--;
                    if (has[-n] > 0) {
                        cout << i << j << "i->" << num[i] << "j->" << num[j] << " -i-j-> " << -n << " ";
                        vector<int> S;
                        S.push_back(num[i]);
                        S.push_back(num[j]);
                        S.push_back(-n);
                        sort(S.begin(), S.end());
                        m.push_back(S);
                    }
                    has[num[i]]++;
                    has[num[j]]++;
                }

            }
        }
        set<vector<int>> uniqueSets(m.begin(), m.end());
        m.assign(uniqueSets.begin(), uniqueSets.end());
        return m;
    }
};

三数之和为0;首先 哈希表统计每个元素数量。

a+b+c=0; 令a+b=n, n=-c。 有多少种,a+b的组合,两层for循环。两层循环中i,j不能指向一个元素。 这样的a+b的组合找到之后,下面该怎么做?是不是如果可以在剩下的部分里面找到-n值就说明存在。如果表示剩下的部分,我们在unordered_map中,将i,j对应的值都减一,这样得到的是去掉一次a+b的其他元素数量。当-n的数量>1说明存在。此时这样的就是一种解。存vector<int> s; [num[i],num[j],-n]这就是一个解。但是需要有序 sort(S.begin(), S.end());之后再存入结果vector。 此时我们是在两层循环内部操作的,我们对(unordered_map中,将i,j对应的值都减一)这一步操作需要还原,等到ij变化后仍然是最原始的unordered_map。 最后仍然需要对结果vector去重。 先转set再转回去。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务