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; }