LeetCode代码运行报signed integer overflow错误,换long long仍未解决
解决signed integer overflow:accumulate导致的整数溢出问题
你的错误根源在于accumulate函数的调用方式:虽然你把sumfromend声明为long long int,但accumulate的第三个参数传递的是0(int类型),这会让函数内部用int类型执行累加操作。当数组元素总和超过int的最大值(2147483647)时,就会触发溢出——哪怕最后把结果赋值给long long也没用,因为溢出已经在累加过程中发生了。
修复方案
把accumulate的初始值改为0LL(long long类型的0),这样函数会用long long类型完成整个累加过程,从根源避免溢出:
long long int sumfromend = accumulate(nums.begin(), nums.end(), 0LL);
修改后的完整代码
class Solution { public: int minimumAverageDifference(vector<int>& nums) { long long int n = nums.size(); long long int sumfromstart = 0; long long int sumfromend = accumulate(nums.begin(), nums.end(), 0LL); int res = INT_MAX; int index = 0; for(int i=0; i<n; i++) { sumfromstart += nums[i]; sumfromend -= nums[i]; int a = sumfromstart/(i+1); int b = (i == n-1)? 0 : sumfromend/(n-i-1); int avg = abs(a-b); if(avg < res) { res = avg; index = i; } } return index; } };
补充说明
accumulate的模板推导规则是:累加结果的类型由第三个初始值参数的类型决定。传递0时,类型是int,所以累加过程中所有中间值都是int,一旦总和超过int上限就会溢出;传递0LL时,类型是long long,整个累加过程都会用long long计算,自然不会出现溢出问题。
内容的提问来源于stack exchange,提问作者Ojaswi Awasthi
相关产品推荐
相关产品推荐

