zoukankan      html  css  js  c++  java
  • 【编程之美】2.15 子数组之和的最大值(二维)

    思路,有了一维的思路,我们想办法把二维问题转化为一维的问题。

    我们假定已经选中了行的范围是 a-c 那么把每一列中 a-c的元素加起来就变成了一个一维的问题。只需对行的范围遍历,再用一维的方法来解就可以了。

    注意,也可以对列的范围遍历,行和列那个小就对哪个遍历。 复杂度为O(M * N * min(M, N))

    #include <stdio.h>
    #include <stdlib.h>
    
    
    void getSumCol(int * a, int aColNum, int RowBegin, int RowEnd, int * SumColArray)
    {
        for(int j = 0; j < aColNum; j++)
        {
            SumColArray[j] = 0;
            for(int i = RowBegin; i <= RowEnd; i++)
            {
                SumColArray[j] += *(a + i * aColNum + j);
            }
        }
    }
    
    int getMax2DArraySum(int * a,const int aRowNum,const int aColNum)
    {
        int MaxSum = a[0];
        int Sum = 0;
        int * SumColArray = (int *)calloc(aColNum, sizeof(a[0]));
        for(int i = 0; i < aRowNum; i++)
        {
            for(int k = i; k < aRowNum; k++)
            {
                getSumCol(a, aColNum, i, k, SumColArray);
    
                Sum = SumColArray[0];
                for(int j = 1; j < aColNum; j++)
                {
                    Sum = (Sum > 0) ? Sum + SumColArray[j] : SumColArray[j];
                    MaxSum = (Sum > MaxSum) ? Sum : MaxSum;
                }
            }
        }
        free(SumColArray);
    
        return MaxSum;
    }
    
    int main()
    {
        int a[4][5] = {
            { 1, 2, 3, 4, 5},
            {-3,-5, 3,-8, 0},
            { 2, 3, 5, 6, 8},
            { -3,1, 2, 3, 0}
        };
    
        int max = getMax2DArraySum((int*)a, 4, 5);
    
        return 0;
    }
  • 相关阅读:
    后缀表达式
    Linux中的硬链接和软链接
    C++中const总结
    atexit()函数
    Linux中的0号进程和1号进程
    什么是可重入函数和不可重入函数
    在线(Online)算法
    PHP验证IP地址输入的准确性:数组数值验证
    PHP网页计时工具——SESSION问题
    软件版本号命名规则
  • 原文地址:https://www.cnblogs.com/dplearning/p/4087178.html
Copyright © 2011-2022 走看看