面试题-lintcode 42 最大子数组II

本文介绍了一个算法问题的解决方案:寻找给定数组中两个不重叠子数组的最大和,采用动态规划方法实现,确保了时间复杂度为O(n)。通过左右两边分别计算最大子数组和,然后选择两者组合的最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

给定数组,找出两个不重叠子数组使它们的和最大。每个子数组的数字在数组中的位置应该是连续的,返回最大的和。

注意事项:子数组最少包含一个数,要求时间复杂度为o(n).

example:

给出子数组[1,3,-1,2,-1,2],这两个子数组分别为[1,3]和[2,-1,2]或者[1,3,-1,2]和[2],它们的和都是7.返回7.

动态规划求解,思路同:剑指offer:连续子数组的最大和_orangefly0214的博客-优快云博客

public class maxTwoSubArrays {
	 public int maxTwoSubArr(int[] nums) {
		 int[] left=new int[nums.length];
		 int[] lMax=new int[nums.length];
		 int[] right=new int[nums.length];
		 int[] rMax=new int[nums.length];
		 left[0]=nums[0];
		 lMax[0]=nums[0];
		 //从左到右遍历,得到从以每一个索引开头的子数组的最大和
		 for(int i=1;i<nums.length;i++){
			 left[i]=Math.max(left[i-1]+nums[i],nums[i]);
			 lMax[i]=Math.max(lMax[i-1], left[i]);
		 }
		 //右往左遍历,得到以每个索引开头的子数组的最大和
		 right[nums.length-1]=nums[nums.length-1];
		 rMax[nums.length-1]=nums[nums.length-1];
		 for(int i=nums.length-2;i>=0;i--){
			 right[i]=Math.max(right[i+1]+nums[i],nums[i]);
			 rMax[i]=Math.max(right[i], rMax[i+1]);
		 }
		 //求两个子数组的最大,就是找left从0-i,right从i+1,length的最大子数组的和
		 int ret=lMax[0]+rMax[1];
		 for(int i=1;i<nums.length-1;i++){
			 if(lMax[i]+rMax[i+1]>ret){
				 ret=lMax[i]+rMax[i+1];
			 }
		 }
		return ret;
	       
	    }

	public static void main(String[] args) {
		maxTwoSubArrays msa=new maxTwoSubArrays();
		int[] arr={1,3,-1,2,-1,2};
		System.out.println(msa.maxTwoSubArr(arr));
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值