最大子数组中的特殊情况

时间:2019-02-27 11:44:39

标签: c algorithm divide-and-conquer

我使用分而治之来解决最大子数组问题。 它在大多数情况下都能正常工作,但在特殊情况下却无法工作。 我认为问题可能会在这里发生:

struct subarray maximum_crossing(int A[], int low, int mid ,int high){
    int left_sum = INT_MIN;
    int left_max = mid;
    int sum = 0;
    for (int i=mid; i >= low; i--){
        sum += A[i];
        if (sum > left_sum){
            left_sum = sum;
            left_max = i;
        };
    };
    ..........
    ..........

我对其进行了测试,并且在普通情况下确实可以很好地工作。 但是,当数组看起来像这样:{-2147483648,-2147483648,-2147483648}时,它将返回最大子数组从0开始,以1结尾,并且最大和为0。我认为这是因为INT_MIN + INT_MIN将是0 inC。

或者在{-2147483648,-1,0}中,代码将发现最大子数组从0开始,以1结尾,最大和为2147483648。由于这个问题,一旦数组具有-2147483648并且其他值为负值,代码将无法正常工作。

我尝试使用if语句先检查A [i]的值,但是我发现这不是最佳解决方案。因为其他负值仍可加在一起超过-2147483648。那么,有没有更合适的方法来解决这种情况呢?

1 个答案:

答案 0 :(得分:1)

  

最大总和为2147483648

2147483648(十进制)为2 ^ 31,如果您的 int 处于32位2147483648上,则有符号的 int 溢出,因此max_sum不能为2147483648 < / p>

sumleft_sum使用 long (假定为64b)