15. 三数之和

87 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

15. 三数之和

  • 题号:力扣15
  • 知识点:数组,双指针
  • 总结 题干: 在这里插入图片描述在这里插入图片描述 思路:
  • 1.首先对数组进行排序,为了后续使用双指针
  • 2.使用一层遍历,这层遍历的数当作a,然后再定义左指针和右指针,分别对应b和c。
  • 3.固定a的值,使用while循环,查找符合a+b+c=0的b和c的值。
  • 4.难点:注意输出结果去重,去重方法,如果当前位置和上一个位置的数值一样的话,就跳过。
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        // 数组长度不够
        if (nums.size() < 3){
            return {};
        }
        // 保存返回结果
        vector<vector<int>> ret;
        // 遍历排序之后的数组
        for (int i = 0; i<nums.size(); i++){
            // 如果最小的数已经大于0了,就直接返回
            if (nums[i] > 0){
                return ret;
            }
            // a去重
            if (i>0 && nums[i] == nums[i-1]){
                continue;
            }
            // b
            int left = i+1;
            // c
            int right = nums.size() - 1;

            while(right > left){
                if (nums[i] + nums[left] + nums[right] > 0){
                    // 说明right大了
                    right--;
                    while(right>left && nums[right] == nums[right+1]) right--;
                }
                else if (nums[i] + nums[left] + nums[right] < 0){
                    // 说明left小了
                    left++;
                    while(right>left && nums[left] == nums[left-1]) left++;
                }
                else{
                    // 保存结果
                    ret.emplace_back(vector<int>{nums[i], nums[left], nums[right]});
                    // 向中间收缩
                    right--;
                    left++;
                    // 去重
                    while(right>left && nums[left] == nums[left-1]) left++;
                    while(right>left && nums[right] == nums[right+1]) right--;
                }
            }
        }
        return ret;
    }
};