之前有做过这类题,甚至有扩展版的子矩阵最大累加和问题,但隔了几个月不练习果然忘了基础不扎实。
做了中国邮政商务运营中心的笔试题,都是很基础的题目。不过这道手写代码题我还是有点卡住了,想得太复杂。
输入:一个整型数组,数组个数;
输出:子数组的最大累加和。
当时想的是用两个指针去限定子数组的范围,其实完全没必要啊。左边限定的指针右移后,结果必然只能更小,因为舍去的是正数。
直接依次遍历一半,中途如果当前和小于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 }