0
点赞
收藏
分享

微信扫一扫

15. 三数之和

菜菜捞捞 2022-02-28 阅读 88

题目

排序 + 二重循环

考虑到会出现数字重复的情况,因此首先应该对数据进行排序,这样就能保证重复数字出现在相邻的位置上,进而在运算过程中可以将其去除。

由于排序后的数据满足从小到大的规律,因此前面两数之和的配对数字必然在后面,因此可以从前后两个方向进行查找。

在查找过程中,如果若三数之和大于 0 ,表示第三个数字偏大,此时需要向前遍历更小的数字;反之若小于 0 ,则表示没有三数之和等于 0 的情况。因此将所有三数之和等于 0 的数字找出即可。

在前两个数字遍历的过程中,若当前数字与前一个数字相同,则出现了重复数字的情况,应该忽略该数字,代码如下:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end()); // 排序
        for(int i = 0; i < nums.size(); ++i) {
            int r = nums.size() - 1;
            for(int l = i + 1; l < r; ++l) {
                int tmp = nums[i] + nums[l];
                while(r > l && tmp + nums[r] > 0) // 移动末尾指针
                    r--;
                if(l < r && tmp + nums[r] == 0) // 记录输出
                    res.push_back(vector<int>{nums[i], nums[l], nums[r]});
                while(l + 1 < r && nums[l] == nums[l + 1]) // 判断重复
                    l++;
            }
            while(i + 1 < nums.size() && nums[i + 1] == nums[i]) // 判断重复
                i++;
        }
        return res;
    }
};
举报

相关推荐

0 条评论