码迷,mamicode.com
首页 > 编程语言 > 详细

【剑指offer】连续子数组的最大和,C++实现

时间:2018-04-13 23:28:51      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:ice   pre   test   interview   else   UI   复杂   正数   时间复杂度   

原创博文,转载请注明出处!
本题牛客网地址

博客文章索引地址

博客文章中代码的github地址


# 题目

      输入一个整形数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值,时间复杂度为O(n)。


# 思路

分析计算连续子数组最大和的规律

      下图是我们计算数组(1,-2,3,10,-4,7,2,-5)中子数组的最大和的过程。设置两个辅助变量,即累加子数组和cur_sum、最大子数组和max_sum。初始的累加子数组和cur_sum为数组的第一个元素,初始的最大子数组和max_sum为数组的第一个元素。

  • 更新cur_sum的规律:如果cur_sum>0,则继续累加;否则用下一个元素值替换累加的子数组和。
  • 更新max_sum的规律:如cur_sum>max_sum,则用累加的子数组和替换最大的子数组和。

技术分享图片


# 代码

  1 class Solution {
  2 public:
  3     int FindGreatestSumOfSubArray(vector<int> array)
  4     {
  5         // 鲁棒性
  6         if(array.empty())return 0;
  7 
  8         // 辅助变量
  9         int cur_sum = array[0];// cur_sum为当前和
 10         int max_sum = array[0];// max_sum为最大和
 11 
 12         // 遍历所有元素
 13         for(int i = 1; i < array.size(); ++i)
 14         {
 15             // 更新cur_sum
 16             if(cur_sum <= 0){
 17                 cur_sum = array[i];
 18             }
 19             else{
 20                 cur_sum += array[i];
 21             }
 22             // 跟新max_sum
 23             if(cur_sum > max_sum){
 24                 max_sum = cur_sum;
 25             }
 26         }
 27         return max_sum;
 28     }
 29 };

【剑指offer】连续子数组的最大和,C++实现

标签:ice   pre   test   interview   else   UI   复杂   正数   时间复杂度   

原文地址:https://www.cnblogs.com/wanglei5205/p/8824301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!