子数组的最大累加和问题-腾讯/百度/字节跳动笔试编程C/C++

求子数组题,赶紧动笔和有猫彬一起算起来~

目录

题目描述:

思路一(28.57分)

思路二(100分)

满分C++代码


题目描述:

给定一个数组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;
    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值