LeetCode 15. 3Sum

原题链接
任何一个算法代码实现十六字真言:

有法可依, 有法必依, 执法必严, 违法必究.

闲话

法就是算法, 就是逻辑, 就是Logos.
太初有道,道与神同在,道就是神。

有法可依: 有法可依
有法必依: 喜欢我暴力吗🤠
执法必严: 默写跟着逻辑走, 不是跟着记忆力走, 不是记自己之前写过好多次是怎么写的, 这里好像要加个什么
违法必究: 人肉 Debug 时把逻辑跑一遍

「十六字真言」真灵啊!

一周目

is Bad End 给默写哥幽默完了.

// 收缩+双指针
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
      sort(nums.begin(), nums.end());
      vector<vector<int>> res;
      int n = nums.size();
      for (int i = 0; i < n - 2; ++i){
        if (i > 0 && nums[i] == nums[i - 1]) {
          continue;
        }
        int x = nums[i], j = i + 1, k = n - 1;
        if (x + nums[i + 1] + nums[i + 2] > 0) {
          break;
        }
        if (x + nums[k] + nums[k - 1] < 0) {
          continue;
        }
        while (j < k) {
          int s = x + nums[j] + nums[k];
          if (s < 0) {
            ++j;
          } else if (s > 0) {
            --k;
          } else {
            res.push_back(vector<int>{x, nums[j], nums[k]});
            ++j;
            --k;
            while (j < k && nums[j] == nums[j - 1]) {
              ++j;
            }
            while (j < k && nums[k] == nums[k + 1]) {
              --k;
            }
          }
        }
      }
      return res;
    }
};