输入一个单链表,链表中一个或多个连续的整数组成一个子链表。求所有子链表和的最大值。
1.你能不使用额外的O(n)空间复杂度来完成该题吗?
2.你能使用递归解法来完成该题吗?
3.如果你能使用递归解法完成本题,本题也可以看成二叉树中的最大路径和的一个子问题,可以尝试递归解法该题之后,去突破二叉树中的最大路径和
数据范围:链表长度满足 ,链表中的值满足
{1,-2,3,10,-4,7,2,-5}
18
{2}
2
{-10}
-10
// write code here if (head.next == null) { return head.val; } ArrayList<Integer> integerArrayList = new ArrayList<Integer>(); while (head != null) { integerArrayList.add(head.val); head = head.next; } int[] headIntArray = integerArrayList.stream().mapToInt(Integer::intValue).toArray(); int len = headIntArray.length; int[] dp = new int[len]; int max = headIntArray[0]; dp[0] = headIntArray[0]; for (int i = 1; i < len; i++) { dp[i] = Math.max(dp[i-1]+headIntArray[i],headIntArray[i]); max = Math.max(dp[i],max); } return max;
import java.util.*; public class Solution { public int FindGreatestSumOfSubArray (ListNode head) { // 使用动态规划的思想,达到时间复杂度O(n),空间复杂度O(1) //遍历到每一个节点,就记录下当前节点的最大子链表和,遍历到末尾,返回就行 //这里是链表,事先不知道长度,所以要创建dp[] 数组还得先遍历一次链表,所以‘ //这里只用两个个变量,一个pre代表dp[i] ,一个max记录最大和, //递推方程: dp[i]=Math.max(nums[i],dp[i-1]+nums[i]); if(head.next==null)return head.val; int max=0; int pre=0; while(head!=null){ pre=Math.max(head.val,pre+head.val); max=Math.max(max,pre); head=head.next; } return max; } }