[剑指Offer]42-连续子数组的最大和/ [LeetCode]53. 最大子序和

题目链接

https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题意

例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和(子向量的长度至少是1).

解题思路

思路一 O(n):
从前向后遍历,若和为负值,则更新起点;若和为正值,当出现比当前 记录和最大值变量中的最大值 大时,则更新变量。

思路二,动态规划的思路(与思路一思想一致,实现方式不同) O(n):
max[I]记录从头扫到i位置元素为止和最大值。
状态转移方程:max[i]=max[i-1]+val[i],当max[i-1]>0;max[i]=val[I],当max[i-1]<0。

思路一代码(Java)

class Solution {
  public int maxSubArray(int[] nums) {
		if (nums == null || nums.length == 0) {
			return 0;
		}

		int sum = 0;
		int max = Integer.MIN_VALUE;
		for (int num : nums) {
			sum += num;
			if (sum > max) {
				max = sum;
			}
			if (sum < 0) {
				sum = 0;
			}
		}
		return max;
	}
}

思路二代码(C++)

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        vector<int> sum;
        for(int i=0;i<array.size();++i){
            if(i==0){
                sum.push_back(array[i]);
            }
            else{
                if(sum[i-1]<=0){
                    sum.push_back(array[i]);
                }
                else{
                    sum.push_back(sum[i-1]+array[i]);
                }
            }
        }
        int maxSum;
        for(auto it=sum.begin();it!=sum.end();++it){
            if(it==sum.begin()){
                maxSum=*it;
            }
            else{
                if(*it>maxSum){
                    maxSum=*it;
                }
            }
        }
        return maxSum;
    }
};
原文地址:https://www.cnblogs.com/coding-gaga/p/10543278.html