LeetCode之三数之和

题目链接:https://leetcode-cn.com/problems/3sum/
在这里插入图片描述
解题步骤:
从题意上看,暴力的解法就是使用三重循环遍历数组,判断a + b + c是否等于0,如果等于则将这个组合放进三元组集合中。但是使用这种解法提交时,会超出时间限制,而且很难满足题目中提到的答案中不可以包含重复的三元组的条件。

基本思路都是枚举数组中的三个数,判断相加是否等于0,可以选确定a值,再枚举b、c:

  • 对数组进行排序
  • 选取第i个元素nums[ i ],0 <= i <= nums.size() - 2 && nums[i] <= 0
  • 初始化双指针 left = i + 1, right = nums.size() - 1
  • 判断nums[ i ] + nums[ left ] + nums[ right] == 0 ?
  • 移动left或rigth

C++实现:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int size = nums.size();
        vector<vector<int>> res;
        int left, right;

        sort(nums.begin(), nums.end()); // 数组升序
        for (int i = 0; i < size - 2; i++) {
            if (nums[i] > 0)  // 如果nums[i] > 0, 则后面的数都 > 0,不需要再遍历
                return res;
            if (i > 0 && nums[i] == nums[i-1])  // 过滤重复项
                continue;
            left = i + 1;  // 双指针初始化
            right = size - 1;
            while(left < right) {
                if (nums[i] + nums[left] + nums[right] == 0) {  // 满足条件
                    res.push_back({nums[i], nums[left], nums[right]});
                    while(left < right && nums[right] == nums[right-1])  // 过滤重复项
                        right -= 1;
                    while(left < right && nums[left + 1] == nums[left])  // 过滤重复项
                        left += 1;
                    right -= 1;  // 更新双指针
                    left += 1;
                }
                else if (nums[i] + nums[left] + nums[right] < 0) {  // < 0 则将lef右移,整体值增加
                    left += 1;
                }
                else {  // > 0 则将right左移,整体值减少
                    right -= 1;
                }
            }
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值