说明
因为本题与我之前的博客 链接: 三数之和 十分相似,就多套了一个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;
}
};