求子数组题,赶紧动笔和「有猫彬」一起算起来~
目录
题目描述:
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
[要求]
时间复杂度为O(n),空间复杂度为O(1)
(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)
例:
输入:[1, -2, 3, 5, -2, 6, -1]
返回值:12
(这是牛客网提供的一道题目,想尝试的码友们,可以通过这个链接挑战https://www.nowcoder.com/practice/554aa508dd5d4fefbf0f86e5fe953abd?tpId=188&&tqId=38594&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question-ranking)
思路一(28.57分)
其实,拿到这个题, 「有猫彬」是没有思路的😥
我就想啊,那就用最笨的办法试试
Tips:遇到不会的题,就用最笨的办法试试。
思路:计算arr中每个子数组的和,从中取最大的
(1)手工计算下-->
arr = [1, -2, 3, 5, -2, 6, -1] | ||||||||
从arr[i]到arr[j]的累和 | j | |||||||
1 | -2 | 3 | 5 | -2 | 6 | -1 | ||
i | 1 | 1 | -1 | 2 | 7 | 5 | 11 | 10 |
-2 | -2 | 1 | 6 | 4 | 10 | 9 | ||
3 | 3 | 8 | 6 | 12 | 11 | |||
5 | 5 | 3 | 9 | 8 | ||||
-2 | -2 | 4 | 3 | |||||
6 | 6 | 5 | ||||||
-1 | 5 |
(2)上代码-->
class Solution {
public:
/**
* max sum of the subarray
* @param arr int整型vector the array
* @return int整型
*/
int maxsumofSubarray(vector<int>& arr) {
// write code here
int maxnum = 0;
for(int i = 0; i < arr.size(); i++){
int he = 0;/*(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)*/
for(int j = i; j < arr.size(); j++){
he += arr[j];
if(he > maxnum){
maxnum = he;
}
}
}
return maxnum;
}
};
/*(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)*/
不出意料,7个测试点,只通过了两个… …
但一时我又没什么其它思路,反复读题目、苦苦思索,外加看会儿《红顶商人胡雪岩》
突然,灵光乍现💡,
💡 - “题目保证没有全为负数的数据”--这个条件还没有充分利用
💡 - 似乎可以借鉴“最长不下降子序列”一些思路
于是,就有了下面的思路二
(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)
思路二(100分)
💡1 -题目保证没有全为负数的数据 - 则 累和 > 0 --则当某段数组累和为负数时,该舍弃该段
💡2 -依次计算从数组头到arr[i]时的最大累和,取这些累和中的最大值
i | arr[i] | f (从数组头到arr[i]时的最大累和) | maxnum (这些累和中的最大值) | 备注 | 数组和子数组示意图 |
0 | 1 | 1 | 1 | [1, -2, 3, 5, -2, 6, -1] | |
1 | -2 | 0 | 因为1、-2的累和为-1,根据【💡1 -当某段数组累和为负数时,该舍弃该段】,我们舍弃=并置f为0 | [1, -2, 3, 5, -2, 6, -1] | |
2 | 3 | 3 | 3 | [1, -2, 3, 5, -2, 6, -1] | |
3 | 5 | 8 | 8 | [1, -2, 3, 5, -2, 6, -1] | |
4 | -2 | 6 | 8 | 因为f<maxnum,所以maxnum仍旧为8 | [1, -2, 3, 5, -2, 6, -1] |
5 | 6 | 12 | 12 | [1, -2, 3, 5, -2, 6, -1] | |
6 | -1 | 11 | 12 | [1, -2, 3, 5, -2, 6, -1] |
满分C++代码
class Solution {
public:
/**
* max sum of the subarray
* @param arr int整型vector the array
* @return int整型
*/
int maxsumofSubarray(vector<int>& arr) {
// write code here
int maxnum = 0;
int f = 0;
for(int i = 0; i < arr.size(); i++){
f += arr[i];
if(f < 0){
f = 0;
}/*(更多博文,欢迎来我的博客学习交流https://blog.csdn.net/have_a_cat)*/
if(f > maxnum){
maxnum = f;
}
}
return maxnum;
}
};