题解 | #连续子数组的最大和#

连续子数组的最大和

http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484

思路

题目分析

  1. 题目给出了一个整数数组
  2. 要求我们返回其中子数组的和的最大值
  • 方法一:暴力
    • 我们可以通过双重循环来对所有的子数组进行求和
    • 一重循环遍历起点,另一重循环遍历终点
    • 返回子数组求和的最大的那一个即可
  • 方法二:动态规划
    • 我们规定dp[n]代表包括array[n]在内的子数组的和的最大值
    • 维护动态规划数组的操作即
      • 如果dp[n-1]>0,则dp[n] = dp[n-1] + array[n],说明当前的元素要和前面累计的正数和加起来才是当前的子数组和最大
      • 否则dp[n] = array[n]
    • 最终返回dp数组中最大的一个即可

方法一:暴力

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int n = array.size();
        int mx = INT_MIN;
        for(int i = 0;i < n;i++){				// 外层循环遍历所有子数组起点
            int sum = array[i];
            for(int j = i+1; j < n; j++){		// 内层循环记录所有的子数组的和的值,并更新最大值
                mx = max(mx, sum);
                sum += array[j];
            }
            mx = max(mx, sum);
        }
        return mx;
    }
};

复杂度分析

  • 时间复杂度:O(N2)O(N^2),双重循环的时间代价
  • 空间复杂度:O(1)O(1),未引入额外空间

方法二:动态规划

alt

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int mx = array[0];
        vector<int> dp(array.size(),array[0]);
        for(int i = 1; i < array.size(); i++) {
            if(dp[i-1] > 0) dp[i] = dp[i-1] + array[i];		// 如果前面的子数组和累计为正数,则加到当前元素array[i]上才是包含当前元素的最大子数组和
            else dp[i] = array[i];							 // 否则不能用前面的和为负的部分
            mx = max(mx, dp[i]);							 // 保持更新最大值 
        }
        return mx;
    }
};

复杂度分析

  • 时间复杂度:O(N)O(N),只有一次循环
  • 空间复杂度:O(N)O(N),动态规划数组的空间消耗
不会做题写的题解 文章被收录于专栏

哎呀我好笨呀,一不小心又不会了一道题

全部评论

相关推荐

Noel_:中石油是这样的 哥们侥幸混进免笔试名单 一看给我吓尿了
点赞 评论 收藏
分享
11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务