lintcode最大子数组||
2018-03-11 13:41
295 查看
问题描述:
给定一个整数数组,找出两个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
样例:
给出数组[1, 3, -1, 2, -1, 2]
这两个子数组分别为
[1, 3]和
[2, -1, 2]或者
[1, 3, -1, 2]和
[2],它们的最大和都是
7
思路:
从左到右依次给出前n个数相加的最大值,然后从右到左依次给出后n个数相加的最大值。以[1, 3, -1, 2, -1, 2]为例:
从左到右:1 4 4 5 5 6
从右到左:6 5 3 3 2 2
然后将其错位相加:6 6 7 7 7 7 6
显然最大值是7
答案:
public int maxTwoSubArrays(ArrayList<Integer> nums) { // write your code int[] leftMax = new int[nums.size()], rightMax = new int[nums.size()]; int sum = nums.get(0); leftMax[0] = nums.get(0); int maxVal = nums.get(0); for(int i = 1; i < nums.size(); i++){ sum = Math.max(nums.get(i), sum + nums.get(i)); maxVal = Math.max(maxVal, sum); leftMax[i] = maxVal; } sum = nums.get(nums.size() - 1); rightMax[nums.size() - 1] = sum; maxVal = sum; for(int i = nums.size() - 2; i >= 0; i--){ sum = Math.max(nums.get(i), sum + nums.get(i)); maxVal = Math.max(maxVal, sum); rightMax[i] = maxVal; } int ans = Integer.MIN_VALUE; for(int i = nums.size() - 1; i > 0; i--) ans = Math.max(ans, rightMax[i] + leftMax[i - 1]); return ans; }
相关文章推荐
- LintCode 45 最大子数组差
- LintCode: 最大子数组
- Google/LintCode:M-最大平均值子数组
- LINTCODE——最大子数组III
- lintcode--41. 最大子数组
- LintCode 42 最大子数组 I
- lintcode&九章算法——Google 面试题 | 3个非重复子数组最大和
- lintcode 42 最大子数组 II 解析
- LintCode 43 最大子数组 III
- lintcode -- 最大子数组II
- LintCode -- 最大子数组 III
- Lintcode-贪心-最大子数组和最小子数组
- lintcode-45-最大子数组差
- lintcode--42. 最大子数组 II
- LintCode:M-乘积最大子序列
- lintcode 中等题:Maximal Square 最大子正方形
- Lintcode删除排序数组的重复数字
- LintCode-直方图最大矩形覆盖
- LintCode做题记录-两数组的交 II
- lintcode:最大间隔