为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?
Posted
技术标签:
【中文标题】为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?【英文标题】:Why this code is working fine at leetcode but giving segmentation fault at geeksforgeeks?为什么这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误? 【发布时间】:2020-10-26 06:07:04 【问题描述】:gfghttps://practice.geeksforgeeks.org/problems/subset-sum-problem2014/1
leetcode https://leetcode.com/problems/partition-equal-subset-sum/
问题: 给定一个大小为 N 的数组 arr[],检查它是否可以分成两部分,使得两部分的元素之和相同。
例子
输入:N = 4 arr = 1, 5, 11, 5 输出:是 解释: 这两个部分是 1, 5, 5 和 11。
class Solution
public:
static int equalPartition(int N, int arr[])
int sum = 0;
for (int i=0; i<N; i++)
sum += arr[i];
if (sum % 2 != 0)
return 0;
sum = sum/2;
int row = N+1;
int col = sum+1;
int dp[row][col];
for (int i=0; i<col; i++)
dp[0][i] = 0;
for (int i=0; i<row; i++)
dp[i][0] = 1;
for (int i=1; i<row; i++)
for (int j=1; j<col; j++)
if ( j< arr[i-1])
dp[i][j] = dp[i-1][j];
else
if(j-arr[i-1] > 0)
dp[i][j] =max(dp[i-1][j], dp[i-1][j-arr[i-1]]);
else
dp[i][j] = dp[i-1][j];
return dp[row-1][col-1];
;
【问题讨论】:
如果数组是 1, 5, 11, -5
,那是否算作 1, 5
和 11, -5
?请提供A Minimal, Complete, and Verifiable Example (MCVE)。
int dp[row][col];
不是有效的 C++,(但某些编译器通过扩展支持)。您应该在 std::vector
周围使用一些 2d 包装器。
使用 std::vector<std::vector<int>> dp(row, std::vector<int>(col));
代替 VLA。然后当你这样做时,使用at()
而不是[ ]
来访问元素,例如:dp.at(i).at(j) = dp.at(i-1).at(j);
。我敢打赌,您现在会在这两个网站上收到 std::out_of_range
异常。
sum
和N
的约束是什么?我能找到的一个错误是j-arr[i-1] > 0
,这不应该是j-arr[i-1] >= 0
,但这不应该导致分段错误吗?
【参考方案1】:
因此,出于好奇,我注册了门户网站以找出问题所在。我能够使用以下代码得到正确答案。代码稍作改动,主要是空间压缩。
正如我所怀疑的,N
(100) 的约束和 array
(1e5) 中的值之和非常关键,会导致分段错误。
也应该是j-arr[i-1] >= 0
,而不是j-arr[i-1] > 0
。
空间压缩说明:
我们只需要i-1
这个状态来计算当前状态i
的值,所以每个sum
大小的2个数组就足够了。我保留了一个参考 curr
以记住 2 个数组中的哪一个被视为当前数组,curr^1
将是前一个数组。我们可以进一步优化到只有大小为sum
的单个数组,但这超出了答案的范围。
int equalPartition(int N, int arr[])
int sum = 0;
for (int i=0; i<N; i++)
sum += arr[i];
if (sum % 2 != 0)
return 0;
sum = sum/2;
int row = N+1;
int col = sum+1;
int dp[2][col]; // change 1
for (int i=0; i<col; i++)
dp[0][i] = 0;
// for (int i=1; i<row; i++)
// dp[i][0] = 1;
dp[0][0] = 1; // change 2, due to space compression don't need above
int curr = 1; // change 3
for (int i=1; i<row; i++, curr^=1) // change 4
for (int j=1; j<col; j++)
dp[curr][j] = dp[curr^1][j]; // change 5
if(j-arr[curr^1] >= 0) // change 6
dp[curr][j] =max(dp[curr][j], dp[curr^1][j-arr[i-1]]); // change 7
return dp[curr^1][col-1]; // change 8
;
【讨论】:
以上是关于为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误
为啥我的程序在发布模式下运行良好,但在调试模式下失败? [关闭]
为啥 spring-boot 应用程序无法在 AWS 中运行,但在本地运行良好?
iOS:为啥动画在 CABasicAnimation 下运行良好,但在 animateWithDuration 下看起来很奇怪?