连续子链表的最大和
思路:
1.由于需要求最长的连续子串之和,所以先可以初始化为最小值
2.用动态规划的解决连续的最长的子串和的思想
3.用一个个max1记录两种选择中较大值:一种情况是将当前的数加到原先串的后面,另一种情况是将该数直接作为一个新的串的起始点
4.再与之前记录下来的最大的连续子串和与这次得到最长的子串和进行比较,得到最大值
代码:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
int FindGreatestSumOfSubArray(ListNode* head) {
//INT_MAX=2^31-1
//INT_MIN=-2^31
//由于是需要求最大连续子串的和,所以可以初始化max1和max2为最小值
//max1用于记录当前这个最长的子串,max2用来记录所有子串中的最长的子串
int max1=INT_MIN;
int max2=INT_MIN;
//将head
while(head!=NULL){
//动态规划求连续子串和的最大值
//有两种情况:一个是在原来的串上加上现在的这个数,还有一种情况是直接重新以该数作为
//新串的开头进行计算该串的最大的和,取两种情况中的最大值
max1=max(head->val+max1,head->val);
//判断一下当前的最大之和的串和当前的最大之前的串中取一个最大的串
max2=max(max2,max1);
head=head->next;
}
return max2;
}
};