LeetCode四数之和题解遇整数溢出,用long long仍报错求助
四数之和整数溢出问题修复
你的代码里的溢出根源不是long long变量存不下值,而是**nums[j] + nums[i]这一步是纯int类型运算**。当两个int数值的和超出int的取值范围(-231到231-1)时,会先触发整数溢出,再把错误的结果赋值给long long类型的temp,这时候已经没法挽回了。比如报错里的-294967296 - 2000000000,本质是nums[i]+nums[j]的结果超出int最小值,导致溢出。
修复方案
只需要把相加的其中一个数先转成long long,让整个运算提升为long long类型,避免溢出:
把这一行:
long long int temp = target - (nums[j] + nums[i]);
改成以下任意一种都可以:
// 方式1:先转其中一个加数为long long long long int temp = target - ( (long long)nums[i] + nums[j] ); // 方式2:拆分减法,逐个转成long long运算 long long int temp = (long long)target - nums[i] - nums[j];
修改后的完整代码
class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> res; if(nums.empty()){ return res; } int n = nums.size(); sort(nums.begin(), nums.end()); for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ // 修复溢出问题:先将target转为long long再做减法 long long int temp = (long long)target - nums[i] - nums[j]; int front = j+1; int back = n-1; while(front < back){ long long int twosum = nums[front] + nums[back]; if(twosum < temp){ front++; } else if(twosum > temp){ back--; } else{ vector<int> ans(4,0); ans[0] = (nums[i]); ans[1] = (nums[j]); ans[2] = (nums[front]); ans[3] = (nums[back]); res.push_back(ans); while(front < back && nums[front] == ans[2]) ++front; while(front < back && nums[back] == ans[3]) --back; } } while(j+1 < n && nums[j+1] == nums[j]) ++j; } while(i+1 < n && nums[i+1] == nums[i]) ++i; } return res; } };
内容的提问来源于stack exchange,提问作者Bharath Gowda
相关产品推荐
相关产品推荐

