Given an array with integers.

Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)| is the largest.

Return the largest difference.

Note
The subarray should contain at least one number Example
For [1, 2, -3, 1], return 6 Challenge
O(n) time and O(n) space.

思路:把数组分成两部分,可以从i和i+1(0<=  i < len-1)之间分开,a[0, i] a[i+1, len-1],然后分别求两个子数组中的最大子段和,以及最小字段和,然后求差的最大值即可。

 public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two
* Subarrays
*/
public int maxDiffSubArrays(ArrayList<Integer> nums) {
// write your code
if (nums==null || nums.size()==0) return 0;
int len = nums.size();
int[] lGlobalMax = new int[len];
int[] lGlobalMin = new int[len];
int lLocalMax = nums.get(0);
int lLocalMin = nums.get(0);
lGlobalMax[0] = lLocalMax;
lGlobalMin[0] = lLocalMin;
for (int i=1; i<len; i++) {
lLocalMax = Math.max(lLocalMax+nums.get(i), nums.get(i));
lGlobalMax[i] = Math.max(lLocalMax, lGlobalMax[i-1]); lLocalMin = Math.min(lLocalMin+nums.get(i), nums.get(i));
lGlobalMin[i] = Math.min(lLocalMin, lGlobalMin[i-1]);
} int[] rGlobalMax = new int[len];
int[] rGlobalMin = new int[len];
int rLocalMax = nums.get(len-1);
int rLocalMin = nums.get(len-1);
rGlobalMax[len-1] = rLocalMax;
rGlobalMin[len-1] = rLocalMin;
for (int i=len-2; i>=0; i--) {
rLocalMax = Math.max(rLocalMax+nums.get(i), nums.get(i));
rGlobalMax[i] = Math.max(rLocalMax, rGlobalMax[i+1]); rLocalMin = Math.min(rLocalMin+nums.get(i), nums.get(i));
rGlobalMin[i] = Math.min(rLocalMin, rGlobalMin[i+1]);
} int maxDiff = Integer.MIN_VALUE;
for (int i=0; i<len-1; i++) {
if (maxDiff < Math.abs(lGlobalMax[i]-rGlobalMin[i+1]))
maxDiff = Math.abs(lGlobalMax[i]-rGlobalMin[i+1]); if (maxDiff < Math.abs(lGlobalMin[i]-rGlobalMax[i+1]))
maxDiff = Math.abs(lGlobalMin[i]-rGlobalMax[i+1]);
}
return maxDiff;
}
}

最新文章

  1. Shell脚本编程30分钟入门
  2. 转载 c# 颜色对照表
  3. 使用IronPython给.Net程序加点料
  4. 构造方法特点,void
  5. 《JS高程》基本类型和引用类型的值学习笔记
  6. 五指cms内容浏览量实现方法
  7. printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换函数
  8. Azure 云服务中的实例端点
  9. 机房收费系统(VB.NET)——存储过程实战
  10. jquery 缓冲加载图片插件 jquery.lazyload
  11. 在LINUX终端和VIM下复制粘贴
  12. Oracle查询笔记
  13. 多模块Maven项目怎样使用javadoc插件生成文档
  14. 定时发布任务,在global.asax中获取文件的物理路径的方法
  15. karma+jasmine自动化测试
  16. bzoj 2339: [HNOI2011]卡农
  17. IDEA安装插件提示was not installed: Cannot download解决办法
  18. Markdown使用方法
  19. 关于redis中SDS简单动态字符串
  20. TR-069: ACS Discovery

热门文章

  1. Law of total probability
  2. SQL实现将一个表的数据插入到另外一个表的代码
  3. ubuntu 制作deb 包
  4. zabbix basic concept
  5. 更强大的trim功能,过滤汉字等
  6. Qt持久性对象进行序列化
  7. Socket通信原理探讨(C++为例) good
  8. [LeetCode]题解(python):050-Pow(x, n)
  9. Java多线程 - 线程状态
  10. 【Algorithm】堆排,C++实现