为啥这段代码在 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&lt;std::vector&lt;int&gt;&gt; dp(row, std::vector&lt;int&gt;(col)); 代替 VLA。然后当你这样做时,使用at() 而不是[ ] 来访问元素,例如:dp.at(i).at(j) = dp.at(i-1).at(j);。我敢打赌,您现在会在这两个网站上收到 std::out_of_range 异常。 sumN 的约束是什么?我能找到的一个错误是j-arr[i-1] &gt; 0,这不应该是j-arr[i-1] &gt;= 0,但这不应该导致分段错误吗? 【参考方案1】:

因此,出于好奇,我注册了门户网站以找出问题所在。我能够使用以下代码得到正确答案。代码稍作改动,主要是空间压缩。

正如我所怀疑的,N (100) 的约束和 array (1e5) 中的值之和非常关键,会导致分段错误。

也应该是j-arr[i-1] &gt;= 0,而不是j-arr[i-1] &gt; 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 下看起来很奇怪?

Flutter:一个程序在调试模式下运行良好,但在发布后就不行,为啥?

javascript 在 mozilla 中运行良好,但在 IE6 中出现未知的运行时错误,为啥?