最大子序和

题目: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

利用简单动态规划, 当前数组num[i]有两种情况:

1). 被添加到之前的连续子序中,使得之前的连续子序和增加。

2).  或者以当前值重新开一个起点时的值比被增加到上一个子序后的子序和更大: nums[i] > nums[i]+sum; 并更新sum;

class Solution {
public:
    int max(int a, int b){
        return a > b ? a : b;
    }
    
    int maxSubArray(vector<int>& nums) {
        vector<int> result;           //临时存放子序
        int saved_max = nums[0]; //临时存放最大子序
        int sum = nums[0];          //最后最大结果
        vector<int> fin_result;      //最后最大结果子序
        for(int i = 1; i < nums.size(); i++) 
        {
            //saved_max = max(nums[i], nums[i]+max); 
            if(nums[i] < nums[i] + saved_max){
                saved_max += nums[i];
                result.push_back(nums[i]);
            } else {
                result.clear();
                result.push_back(nums[i]);                    
                
                saved_max = nums[i];
            }
           /* if(saved_max > total_max) {
                total_max = saved_max;
                fin_result.clear();
                fin_result.insert(fin_result.begin(), result.begin(), result.end() );
            }*/
            sum = max(saved_max, sum);
            //total_max = saved_max > total_max ? saved_max : total_max;   
        }
        /*for(int i = 0; i < fin_result.size(); i++) {
           cout << fin_result[i] << ",";
        }*/
        return sum;
    }
};

  

The Safest Way to Get what you Want is to Try and Deserve What you Want.
原文地址:https://www.cnblogs.com/Shinered/p/11378395.html