【力扣18题 四数之和】遇到的问题分析

说明

因为本题与我之前的博客 链接: 三数之和 十分相似,就多套了一个for循环且target不是0.在读过我这篇文章后,一个对四数之和的代码比较容易理解(代码放在最后)。

问题1:容器访问溢出

就类似于数组越界,报错如下:
Line 1037: Char 34: runtime error: addition of unsigned offset to 0x503000000100 overflowed to 0x5030000000fc (stl_vector.h)
当遇到这种报错就去寻找修改指针(或者说哨兵)指向的代码的语句,可以手动在草稿纸上走一下代码。
我的问题处在这

while(nums[d-1]==nums[d] && d>c) d--;
while(nums[c+1]==nums[c] && d>c) c++;

这里是去重代码,在去重的过程中忘记加d>c这个条件了,导致在该题示例2中的【2,2,2,2,2】特殊情况下导致越界。

问题2:c++环境下int转long long类型

在该题提交后的测试用例中有几组的元素异常的大,虽然单个元素不会超过int的大小,但是他们的和会超过int的大小。
报错:
Line 21: Char 58: runtime error: signed integer overflow: 2000000000 + 1000000000 cannot be represented in type ‘value_type’ (aka ‘int’) (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior solution.cpp:21:58

下面是两种转换方法:

//第一种:
sum=static_cast<long long>(a)+b;
//第二种:
sum=long long(a)+b;

代码

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> result;
        if(nums.size()<4) return result;

        sort(nums.begin(),nums.end());
        //nums=vector<long>(nums.begin(),nums.end());
        for(int a=0;a<nums.size()-3;a++)
        {
            if(target<=0&&nums[a]>0) return result;

            if(a>0 && nums[a]==nums[a-1]) continue;
            for(int b=a+1;b<nums.size()-2;b++)
            {
                if(b>a+1 && nums[b]==nums[b-1]) continue;
                int c=b+1;
                int d=nums.size()-1;
                while(d>c)
                {
                    long long sum=static_cast<long long>(nums[a]+nums[b])+static_cast<long long>(nums[c]+nums[d]);
                    if(sum>target)
                    {
                        d--;
                    }
                    else if(sum<target)
                    {
                        c++;
                    }
                    else
                    {
                        result.push_back(vector<int>{nums[a],nums[b],nums[c],nums[d]});
                        while(nums[d-1]==nums[d] && d>c) d--;
                        while(nums[c+1]==nums[c] && d>c) c++;
                        d--;
                        c++;
                    }
                }

            }
        }
        return result;
    }
};
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值