#题解# 三数之和

三数之和

https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711?tpId=295&tqId=731&ru=%2Fpractice%2F50ec6a5b0e4e45348544348278cdcee5&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295

利用互补的性质!!!

class Solution {
public:
  //  和两数之和一样,利用互补性质
    vector<vector<int> > threeSum(vector<int> &num) {
      int size = num.size();
      std::vector<std::vector<int>> res;
      
      if (size < 3) {
        return res;
      }
      
      std::sort(num.begin(), num.end());
      
      for (int i = 0; i < size; ++i) {
        if (i != 0 && num[i - 1] == num[i]) {
          continue;
        }
        
        int left = i + 1;
        int right = size - 1;
        int target = -num[i];
        
        //  一个数字可能搭配多个三重组
        while (left < right) {
          if (num[left] + num[right] == target) {
            res.push_back({num[i], num[left], num[right]});
            while (left + 1 < right && num[left] == num[left + 1]) {
              ++left;
            }
            while (right - 1 > left && num[right] == num[right - 1]) {
              --right;
            }
            //  来到最后一个重复的数字
            ++left;
            --right;
          } else if (num[left] + num[right] > target) {
            --right;
          } else {
            ++left;
          }
        }
      }
      
      return res;
    }
};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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