力扣 15. 三数之和

35 阅读1分钟

🔗 leetcode.cn/problems/3s…

题目

  • 给出一个数组,返回数组中的三个不同下标的 item 之和为 0 的所有元素组合,即三元组为 {nums[i], nums[j], nums[k]},去重后返回

思路

  • 数组排序,按照顺序遍历,固定数字 a,two pointer 分别从剩余数组的头尾找 b 和 c,找到满足 a+b+c 的元素
  • 数组排序后,在固定 a 的情况下,b 逐渐增大,若要满足 a+b+c == 0,c 就逐渐减小,以此优化循环遍历的元素个数
  • 为了保证去重,a 和 b 使用之后,下一轮循环跳过相同元素

代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size() - 2; i++) {
            if (i && nums[i] == nums[i - 1]) continue;
            int k = nums.size() - 1;
            for (int j = i + 1; j < nums.size() - 1 && j < k; j++) {
                if (j > i + 1 && nums[j-1] == nums[j]) continue;
                while (k > j && nums[i] + nums[j] + nums[k] > 0) k--;
                if (k > j && nums[i] + nums[j] + nums[k] < 0) continue;
                if (k > j && nums[i] + nums[j] + nums[k] == 0) ans.push_back({nums[i], nums[j], nums[k]});
            }
        }
        return ans;
    }
};