题解 | 子数组的最大累加和问题

子数组的最大累加和问题

http://www.nowcoder.com/practice/554aa508dd5d4fefbf0f86e5fe953abd

题意分析

  • 理解什么是子数组?
  • 要求子数组最大累加和
  • 注意题目对时间复杂度和空间复杂度的要求
    • 时间:O(N)
    • 空间:O(1)
  • 注意备注信息:包含了所给数据的边界范围,这对算法的选择至关重要的。

解法一:暴力解

思路步骤:

  • 常规思路,直接两层for循环暴力枚举
  • 找到符合题意的最大累加和
  • 虽然理论上可行,但是时间复杂度为O(N^2),实际运行是无法AC的。仅仅作为一种学习思路。

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 result = INT32_MIN;
        int count = 0;
        for (int i = 0; i < arr.size(); i++) { // 设置起始位置
            count = 0;
            for (int j = i; j < arr.size(); j++) { // 每次从起始位置i开始遍历寻找最大值
                count += arr[j];
                result = count > result ? count : result;
            }
        }
        return result;

    }
};

复杂度分析:

时间复杂度:O(N^2) N为数组长度,俩层循环,,根据大O一般法则可知复杂度O(N^2)

空间复杂度:O(1) 常数空间

解法二:贪心

思路步骤:

  • 怎么贪?

  • 不妨以case:[1, -2, 3, 5, -2, 6, -1]为例

  • 当遇到-2时,累加和反而变为负数,此种情况不可能成为最大和

  • 因此在遇到负数时,因该重置累加和为0,继续从i+1开始计算

  • 最后得到一个局部最大和

  • 最终得到一个全局最大和,即是答案

  • 请参考图解
    图片说明

    Java参考代码:

import java.util.*;


public class Solution {
    /**
     * max sum of the subarray
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxsumofSubarray (int[] arr) {
        // write code here
        //存放临时答案
        int thisSum=0;
        //存放最终答案,注意初始化的值
        int ans = Integer.MIN_VALUE;
        int len = arr.length;
        for(int i=0;i<len;i++ ){
            //累加求和
            thisSum

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

小白专属-牛客题解 文章被收录于专栏

专注于牛客平台编程题题解,文字+图解。内容很细,小白友好系列

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
14 2 评论
分享
牛客网
牛客企业服务