#题解# 三数之和

三数之和

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;
    }
};
全部评论

相关推荐

学java时间比较短不到三个月,基本的技术栈都过了一遍就是都不太深,有个小项目。是继续找实习还是沉淀准备秋招呢?找实习的话会花很多时间在八股,放弃的话又怕秋招简历太难看。有无大佬支招
今天java了吗:1.一定要找实习,实习不一定要去,但是找实习过程中的面试经验和心态经验才是最重要的 2.八股本来就是大头,甚至比项目重要 3.这个时间段也是面试比较多的阶段,可以抓住机会锻炼。面试才会发现自己的不足,感觉自己会了和能给面试官娓娓道来是两码事
点赞 评论 收藏
分享
吴offer选手:HR:我KPI到手了就行,合不合适关我什么事
点赞 评论 收藏
分享
牛客383479252号:9,2学生暑期实习失利开始投小厂,给这群人整自信了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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