博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数组】子数组/子矩阵的最大累加和问题
阅读量:4581 次
发布时间:2019-06-09

本文共 1491 字,大约阅读时间需要 4 分钟。

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

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

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

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

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

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

#include 
#include
//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
> 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 }

 

转载于:https://www.cnblogs.com/cnblogsnearby/p/5318525.html

你可能感兴趣的文章
少儿编程Scratch第四讲:射击游戏的制作,克隆的奥秘
查看>>
Oracle学习第七课-表连接及其应用
查看>>
Python基础篇【第十三篇】:面向对象
查看>>
bzoj 2465 小球
查看>>
Study Plan - The Thirty-Fifth Day
查看>>
图的深度优先遍历和广度优先遍历理解
查看>>
multi_index_container性能测试
查看>>
【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验
查看>>
AngularJs学习笔记--IE Compatibility 兼容老版本IE
查看>>
sql server还原数据库文件(.bak)常见问题解决办法笔记
查看>>
列表,元组,字典的常规操作及内置方法
查看>>
LayoutInflater介绍及例子
查看>>
python中星号变量的几种特殊用法
查看>>
centreon 画图x轴乱码
查看>>
初学AFNetWorking笔记
查看>>
团队项目开发总结
查看>>
架构师养成记--13.代码层面用信号量做限流(转)
查看>>
java int转integer方法
查看>>
内存泄漏的常见应用领域
查看>>
[.NET开发] C# 如何更改Word语言设置
查看>>