【数组】子数组/子矩阵的最大累加和问题

之前有做过这类题,甚至有扩展版的子矩阵最大累加和问题,但隔了几个月不练习果然忘了基础不扎实。

做了中国邮政商务运营中心的笔试题,都是很基础的题目。不过这道手写代码题我还是有点卡住了,想得太复杂。

输入:一个整型数组,数组个数;

输出:子数组的最大累加和。

当时想的是用两个指针去限定子数组的范围,其实完全没必要啊。左边限定的指针右移后,结果必然只能更小,因为舍去的是正数。

直接依次遍历一半,中途如果当前和小于0的话,舍掉前面那部分,后面重新求和;其中还要记录每次的当前和,并与下一次加上了下一个元素的和作对比,取最大。

#include <iostream>
#include <climits> //C++中的头文件

using namespace std;

int maxSumSubArr(int *arr, int n){
    if (arr == NULL || n < 1)
        return 0;
    int res = INT_MIN; //结果
    int cur = 0; //当前和    
    for (int i = 0; i < n; i++){
        cur += arr[i]; //直接依次加上
        res = max(res, cur);
        cur = cur < 0 ? 0 : cur;
    }
    return res;
}

int main(){
    int arr[] = {-2, 1, 3, -2, 1, -2, 1};
    cout << maxSumSubArr(arr, 7);
    return 0;      
}

关于子矩阵的最大累加和,同理子数组,把矩阵的行、列当作数组。

 1 int maxSumSubMatrix(vector<vector<int>> matrix){
 2     if (matrix.empty() || matrix.size() ==0 || matrix[0].size() == 0)
 3         return 0;
 4     int res = INT_MIN;
 5     int cur = 0;
 6     int *s = NULL; //累加数组
 7     for (int i = 0; i < matrix.size(); i++){
 8         s = new int[matrix[0].size()]; //每一列的最大累加和
 9         for (int j = i; j < matrix.size(); j++){
10             cur = 0;
11             for (int k = 0; k < matrix[0].size(); k++){
12                 s[k] += matrix[j][k];
13                 cur += s[k];
14                 res = max(res, cur);
15                 cur = cur < 0 ? 0 : cur;
16             }
17         }
18     }
19     return res;
20 }

 

posted @ 2016-03-25 10:40  LizSep  阅读(724)  评论(0编辑  收藏  举报