LintCode:最大子数组 II
2015-11-24 23:11
411 查看
给定一个整数数组,找出两个不重叠子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
您在真实的面试中是否遇到过这个题?
Yes
样例给出数组[1, 3, -1, 2, -1, 2],这两个子数组分别为[1, 3]和[2,
-1, 2]或者[1, 3, -1, 2]和[2],它们的最大和都是7
注意
子数组最少包含一个数
挑战
要求时间复杂度为O(n) Expand
相关题目 Expand
解题思路:
先左边遍历数组,记录该数组的每个元素的左的最大值,
再右边遍历数组,记录该数组的每个元素的右最大值。
所求结果既是左边最大值+右边最大值的最大值
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
您在真实的面试中是否遇到过这个题?
Yes
样例给出数组[1, 3, -1, 2, -1, 2],这两个子数组分别为[1, 3]和[2,
-1, 2]或者[1, 3, -1, 2]和[2],它们的最大和都是7
注意
子数组最少包含一个数
挑战
要求时间复杂度为O(n) Expand
相关题目 Expand
解题思路:
先左边遍历数组,记录该数组的每个元素的左的最大值,
再右边遍历数组,记录该数组的每个元素的右最大值。
所求结果既是左边最大值+右边最大值的最大值
public class Solution { /** * @param nums: A list of integers * @return: An integer denotes the sum of max two non-overlapping subarrays */ public int maxTwoSubArrays(ArrayList<Integer> nums) { // write your code if (nums == null || nums.size() < 2) return 0; int len = nums.size(); int[] lsum = new int[len]; int[] rsum = new int[len]; int sum = 0; int minsum = 0; int max = Integer.MIN_VALUE; for(int i=0;i<nums.size();i++){ sum += nums.get(i); max = Math.max(max, sum-minsum); minsum = Math.min(sum, minsum); lsum[i] = max; } sum = 0; minsum = 0; max = Integer.MIN_VALUE; for(int i=nums.size()-1;i>0;i--){ sum += nums.get(i); max = Math.max(max, sum-minsum); minsum = Math.min(sum, minsum); rsum[i] = max; } max = Integer.MIN_VALUE; for(int i=0;i<len-1;i++){ max = Math.max(max, lsum[i]+rsum[i+1]); } return max; } }
相关文章推荐
- 开启Mysql远程访问的方法
- Xcode error: conflicting types for 'XXXX'
- python heapq
- mybatis 一级缓存和二级缓存简介
- AJAX中数据格式的转换和分类
- LintCode:最多有多少个点在一条直线上
- 不汇报是职场发展的绊脚石
- HTML5学习笔记
- Android学习之在Eclipse看源代码的技巧
- 本地私有CA的创建及证书的签署
- cppconvnet is on line in gitHub
- e
- NFS技术实现图片共享存储
- CSS3里的display
- DOS/WINDOW/LINUX都用什么编写各种语言工具又是用什么开
- A First Look at Rust Language
- 九度 题目1055:数组逆置
- Elasticsearch [2.0] ☞ Java Client API ☞ Query DSL
- 抽象工厂模式
- HDU 1024 Max Sum Plus Plus 简单DP