列表

详情


NC295. 连续子链表最大和

描述

输入一个单链表,链表中一个或多个连续的整数组成一个子链表。求所有子链表和的最大值。

1.你能不使用额外的O(n)空间复杂度来完成该题吗?
2.你能使用递归解法来完成该题吗?
3.如果你能使用递归解法完成本题,本题也可以看成二叉树中的最大路径和的一个子问题,可以尝试递归解法该题之后,去突破二叉树中的最大路径和

数据范围:链表长度满足 ,链表中的值满足

示例1

输入:

{1,-2,3,10,-4,7,2,-5}

输出:

18

示例2

输入:

{2}

输出:

2

示例3

输入:

{-10}

输出:

-10

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 17ms, 内存消耗: 5028KB, 提交时间: 2022-06-15

static const auto io_sync_off = []() {
    std::ios::sync_with_stdio(false);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
    return nullptr;
}
();
class Solution {
  public:
    int FindGreatestSumOfSubArray(ListNode* head) {
        int a = head->val, b = INT_MIN;
        while (head) {
            b = max(head->val, b + head->val);
            a = max(a, b);
            head = head->next;
        }
        return a;
    }
};

C++ 解法, 执行用时: 20ms, 内存消耗: 5024KB, 提交时间: 2022-02-10

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return int整型
     */
    int FindGreatestSumOfSubArray(ListNode* head) {
  int res = head->val, prev = INT_MIN;
  while (head) {
    prev = max(head->val, prev + head->val);
    res = max(res, prev);
    head = head->next;
  }

  return res;
    }
};

C++ 解法, 执行用时: 20ms, 内存消耗: 5068KB, 提交时间: 2022-02-10

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return int整型
     */
    int temp=0,res=0,ma=-1e9;
    int FindGreatestSumOfSubArray(ListNode* head) {
        // write code here
        ListNode*p=head;
        while(p){
            ma=max(ma,p->val);
            temp=max(temp+p->val,0);
            res=max(res,temp);
            p=p->next;
        }
        return ma<0?ma:res;
    }
};

C++ 解法, 执行用时: 21ms, 内存消耗: 5076KB, 提交时间: 2022-02-15

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return int整型
     */
    int FindGreatestSumOfSubArray(ListNode* head) {
        // write code here
        ListNode* cur=head;
        if(head==nullptr)
            return 0;
        int ans=INT_MIN;
        int prev=0;
        while(cur){
            if(prev>0){
                
                ans=max(ans,prev+cur->val);
                prev+=cur->val;
            }
            else{
                ans=max(ans,cur->val);
                prev=cur->val;
            }
            cur=cur->next;
        }
        return  ans;
    }
};

C++ 解法, 执行用时: 22ms, 内存消耗: 5048KB, 提交时间: 2022-02-24

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return int整型
     */
    int FindGreatestSumOfSubArray(ListNode* head) {
        // write code here
        int max = head->val, dp = head->val;
        ListNode *ptr = head->next;
        
        while (ptr != NULL) {
            dp = get_max(dp + ptr->val, ptr->val);
            max = get_max(dp, max);
            ptr = ptr->next;
        }
        return max;
    }
    
    int get_max(int x, int y) {
            if (x > y)
                return x;
            else
                return y;
        }
};

上一题