lintcode -- 最大子数组II
来源:互联网 发布:sql数据库培训多少钱 编辑:程序博客网 时间:2024/05/18 11:49
给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
注意事项
子数组最少包含一个数
给出数组 [1, 3, -1, 2, -1, 2]
这两个子数组分别为 [1, 3]
和 [2, -1, 2]
或者 [1, 3, -1, 2]
和 [2]
,它们的最大和都是 7
/*
数组left ,left[i] 表示从0 到i 这个区间内元素的最大值
同样可以求从i 到 size-1 这个区间的最大值
上面两个值之和的最大值就是答案了
第二个for循环也就是求i 到size -1区间内的全局最大值,然后就想到可以再定义一个数组
right right[i] 表示从i 到 size -1这个区间的最大
下面只需要根据这个两个数组求出最大值的和就好了
max = Math.max(left[i] + right[i+1],max)
再说明下:
left[i] 表示从0 到i 这个区间的最大值
right[i+1] 表示从 i + 1 都 size-1 这个区间的最大值
*/
//左边和右边分别计算max subarray,然后两边加起来最大的就是结果
public class Solution {
public int maxTwoSubArrays(ArrayList<Integer> nums) {
int size = nums.size();
if(nums == null || size == 0)return 0;
int[]left = new int[size];
int[]right = new int[size];
int max = Integer.MIN_VALUE;
int localMax =0;
//保存过程中的最大值
int globalMax = Integer.MIN_VALUE;
for(int i =0;i<size;i++){
localMax = Math.max(localMax+nums.get(i),nums.get(i));
globalMax = Math.max(localMax,globalMax);
left[i] = globalMax;
}
localMax= 0;
globalMax = Integer.MIN_VALUE;
for(int i = size-1;i>=0;i--){
localMax = Math.max(localMax+nums.get(i),nums.get(i));
globalMax = Math.max(localMax,globalMax);
right[i] = globalMax;
}
for(int i =0;i<size-1;i++){
//left[i] 表示从0 到i 这个区间的最大值
//right[i+1] 表示从 i + 1 到 size-1 这个区间的最大值
max = Math.max(max,left[i]+right[i+1]);
}
return max;
}
}
- LintCode:最大子数组 II
- LintCode-最大子数组 II
- lintcode -- 最大子数组II
- lintcode(42)最大子数组 II
- lintcode 42 最大子数组 II 解析
- [Lintcode]Maximum Subarray II 最大子数组 II
- LintCode: 最大子数组
- lintcode ----最大子数组
- lintcode,最大子数组
- 【LintCode】最大子数组
- Lintcode最大子数组
- LintCode 最大子数组
- lintcode最大子数组
- Lintcode:最大子数组
- 【lintcode】最大子数组
- LintCode-最大子数组差
- LintCode-最大子数组 III
- LintCode--最大子数组差
- windows内存体系结构
- Python之windows锁屏
- Lua 基础之协同程序
- 查找-二分查找(折半查找)-java
- 指针变量作函数参数,错误典例
- lintcode -- 最大子数组II
- RecyclerView和ListView的异同
- 关于SSL错误, SSLError: [Errno 1] _ssl.c:510: error:14090086:SSL routines
- 每天五分钟linux(5)-rm
- xUtils 多线程断点下载文件
- java定时器问题
- 文章标题
- C#设计模式(四)抽象工厂模式
- Connectify在开发中的使用