当前位置: 首页 > 知识库问答 >
问题:

为什么这段代码在leetcode上运行良好,但在极客伪造者中却出现了分段错误?

狄峻熙
2023-03-14

GFGhttps://practice.geeksforgeeks.org/problems/subset-sum-problem2014/1

利特科 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个答案

宰父君昊
2023-03-14

所以我出于好奇注册了门户网站,想知道出了什么问题。我能够使用以下代码得到正确的答案。代码进行了轻微的更改,主要是空间压缩。

正如我所怀疑的,N(100)和数组(1e5)中的值之和的约束是导致分割错误的关键。

也代替j-arr[i-1]

空间压缩说明:

我们只需要第< code>i-1个状态来计算当前状态< code>i的值,因此每个大小为< code>sum的2个数组就足够了。我保留了一个引用< code>curr来记住2个数组中的哪一个被认为是当前的,而curr^1将是前一个数组。我们可以进一步优化到大小为< code>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
    }
};
 类似资料: