LeetCode53 - Maximum Subarray:求数组的连续子数组的最大和,并记录子数组的起点和终点位置

思路:《剑指offer》上有这一道题的详解,利用动态规划的思想。

class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        int len=nums.size();
        int max_ending_here=nums[0];
        int max_so_far=nums[0];
        for(int i=1; i<len; i++)
        {
            max_ending_here=max(nums[i],max_ending_here+nums[i]);
            max_so_far=max(max_so_far,max_ending_here);
        }
        return max_so_far;
    }
};

原题目只是要求返回最大和,没有要求返回该最大和对应子数组的索引。以下代码可以返回对应起点和终点索引。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int a[8] = { 1,-2,3,10,-4,7,2,-5 };
    vector<int> num(a, a + 8);
    int curSum = 0;
    int maxSum = INT_MIN;
    int start, end;//记录最终起止点的索引
    int tempStart;//记录每次更新当前和curSum时的起点位置
    for (int i = 0;i < 8;i++)
    {
        if (curSum <= 0)
        {
            tempStart = i;//记录新的起点位置,因为该起点可能为最大和数组的起点
            curSum = num[i];
        }
        else
            curSum += num[i];
        if (curSum > maxSum)
        {
            maxSum = curSum;
            start = tempStart;//更新最大和数组时记录当前最大和子数组的起点和终点
            end = i;
        }
    }
    cout << maxSum << endl;
    cout << start << " " << end << endl;
    return 0;
}

 

posted @ 2017-09-26 14:31  蓦然闻声  阅读(265)  评论(0编辑  收藏  举报