题目

最大子数组差

给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。

返回这个最大的差值。

样例

给出数组[1, 2, -3, 1],返回 6

注意

子数组最少包含一个数

挑战

时间复杂度为O(n),空间复杂度为O(n)

解题

刚做了数组中两个子数组和的最大值,这一题是求差,感觉上题的求解思想应该是可以用的

A B 分别是两个子数组的和,则:

所以

当A>B 的时候A越大越好 B越小越好

当A<B 的时候B越大越好 A越小越好

根据上一题的思想,定义leftMax数组,leftMax[i] 表示0到 i之间元素的全局最大值,定义rightMin矩阵,rightMin [i] 表示i 到 len -1 之间元素的全局最小值

这样abs(leftMax[i] - rightMin[i+1]) 就是0到i 之间元素的最大值 减去 i + 1 到len-之间元素最小值 的绝对值,这个值得最大值就是两个子区间的 差的绝对值的最大值

注意,这样还是有问题的,只是上面提交只能通过53%

上面只是考虑的 A>B的情况,还需要考虑A<B的情况

A >B 的情况是:leftMax - rightMin

A<B  的情况是:rightMax - leftMin,具体思路参考上面的

这样求出两个最大值的最大值就是答案了

public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two
* Subarrays
*/
public int maxDiffSubArrays(int[] nums) {
// write your code here
if(nums == null || nums.length ==0)
return 0;
int len = nums.length;
int[] leftMax = new int[len];
int[] rightMin = new int[len];
int localMax = 0;
int globalMax = Integer.MIN_VALUE;
for(int i=0;i <len ;i++){
localMax = Math.max(localMax + nums[i],nums[i]);
globalMax = Math.max(localMax,globalMax);
leftMax[i] = globalMax;
}
int localMin = 0;
int globalMin = Integer.MAX_VALUE;
for(int i=len-1;i >=0 ;i--){
localMin = Math.min(localMin + nums[i],nums[i]);
globalMin = Math.min(localMin,globalMin);
rightMin[i] = globalMin;
}
int leftMAX = Integer.MIN_VALUE;
for(int i=0;i<len-1;i++){
leftMAX = Math.max(Math.abs(leftMax[i] - rightMin[i+1]),leftMAX);
} int[] leftMin = new int[len];
int[] rightMax = new int[len];
localMin = 0;
globalMin = Integer.MAX_VALUE;
for(int i=0;i <len ;i++){
localMin = Math.min(localMin + nums[i],nums[i]);
globalMin = Math.min(localMin,globalMin);
leftMin[i] = globalMin;
}
localMax = 0;
globalMax = Integer.MIN_VALUE;
for(int i=len-1;i >=0 ;i--){
localMax = Math.max(localMax + nums[i],nums[i]);
globalMax = Math.max(localMax,globalMax);
rightMax[i] = globalMax;
}
int rightMAX = Integer.MIN_VALUE;
for(int i=0;i<len-1;i++){
rightMAX = Math.max(Math.abs(leftMin[i] - rightMax[i+1]),rightMAX);
} return Math.max(leftMAX,rightMAX);
}
}

Java Code

显然上面程序太冗余了

这里的方法和我想的一样

这里也是的,只是部分循环在一起写了

优化下

public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two
* Subarrays
*/
public int maxDiffSubArrays(int[] nums) {
// write your code here
if(nums == null || nums.length ==0)
return 0;
int len = nums.length;
int[] leftMax = new int[len];
int[] rightMin = new int[len];
int[] leftMin = new int[len];
int[] rightMax = new int[len];
int localMax = 0;
int globalMax = Integer.MIN_VALUE;
int localMin = 0;
int globalMin = Integer.MAX_VALUE; for(int i=0;i <len ;i++){
localMax = Math.max(localMax + nums[i],nums[i]);
globalMax = Math.max(localMax,globalMax);
leftMax[i] = globalMax; localMin = Math.min(localMin + nums[i],nums[i]);
globalMin = Math.min(localMin,globalMin);
leftMin[i] = globalMin;
} localMin = 0;
globalMin = Integer.MAX_VALUE;
localMax = 0;
globalMax = Integer.MIN_VALUE;
for(int i=len-1;i >=0 ;i--){
localMin = Math.min(localMin + nums[i],nums[i]);
globalMin = Math.min(localMin,globalMin);
rightMin[i] = globalMin; localMax = Math.max(localMax + nums[i],nums[i]);
globalMax = Math.max(localMax,globalMax);
rightMax[i] = globalMax;
}
int leftMAX = Integer.MIN_VALUE;
int rightMAX = Integer.MIN_VALUE; for(int i=0;i<len-1;i++){
leftMAX = Math.max(Math.abs(leftMax[i] - rightMin[i+1]),leftMAX);
rightMAX = Math.max(Math.abs(leftMin[i] - rightMax[i+1]),rightMAX);
} return Math.max(leftMAX,rightMAX);
}
}

Java Code

简书程序

好像就这个方法了

lintcode:最大子数组差的更多相关文章

  1. lintcode-45-最大子数组差

    45-最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 注意事项 子数组最少包含一个数 样例 给出 ...

  2. C++:最大子数组差

    最大子数组差 内存限制:128 MiB        时间限制:1000 ms 题目描述: 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B) ...

  3. lintcode :最大子数组

    题目:  最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 ...

  4. lintcode 最大子数组III

    题目描述 给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大.每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 注意事项 子数组最少包含一个数 样例 给出数组 [-1 ...

  5. LintCode-最大子数组差

    给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 您在真实的面试中是否遇到过这个题? Yes 例子 给出数组[1 ...

  6. lintcode:最大子数组II

    题目 最大子数组 II 给定一个整数数组,找出两个不重叠子数组使得它们的和最大. 每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 样例 给出数组[1, 3, -1, 2, -1, 2], ...

  7. 最大子数组(LintCode)

    最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 注意 子数 ...

  8. lincode.41 最大子数组

    最大子数组   描述 笔记 数据 评测 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? ...

  9. lintcode-42-最大子数组 II

    42-最大子数组 II 给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大. 每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 注意事项 子数组最少包含一个数 样例 给出数组 [1 ...

随机推荐

  1. 利用Unicode属性移除文本中的标点符号

    原文:http://bbs.csdn.net/topics/270033191   摘抄: str = str.replaceAll("[\\pP‘’“”]", "&qu ...

  2. php异步调试和线上调试网站程序的方法

    当碰到一个网站需要不间断运行,但又需要调试该网站的程序错误的时候,该如何办呢?是靠经验一点点猜测,还是直接打印错误信息让其在页面输出? 下面分享一种方法同时满足这两种条件,既方便网站程序错误调试,又不 ...

  3. Linux的网卡由eth0变成了eth1,如何修复?

    使用wmware安装了linux,安装成功后,使用的网卡是eth0,没有eth1.但是用过一段时间后,不知道为什么eth0无法使用,系统却自动生成了eth1网卡,这可以使用ifconfig命令看的到. ...

  4. 《.NET简单企业应用》技术路线

    前言 工作三年了,一直从事基于.NET体系的企业应用开发,心得和经验也攒了点:担心时间长了给忘了,所以得给写下来,以便以后回味回味:更重要的是能让知识系统化和体系化. 本系列以一个简单的企业应用系统为 ...

  5. 【个人笔记】001-PHP基础-01-PHP快速入门-01-PHP职业路线及PHP前景

    001-PHP基础-01-PHP快速入门 01-PHP职业路线及PHP前景 PHP职业路线 PHP初级工程师 1年以下 3k-6k PHP中级工程师 1-3年6k-10k PHP高级工程师 3年以上  ...

  6. 20145120黄玄曦 《java程序设计》 寒假学习总结

    1和2.我对未来规划不多,我认为好好学习积累知识能帮助我应对未来的挑战,这是我的学习动力之一,此外,了解新知识满足好奇心也是我的主要的学习动力. 3.我认为专业课学习比公务员考试重要,我认为专业知识是 ...

  7. 对于Oracle中分页排序查询语句执行效率的比较分析

    转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...

  8. android 设置叠加父级响应点击事件

    最近做android项目时,需要让button的后面的relatelayout可以点击,但是虽然把button设置成了focusable="false",relatelayout中 ...

  9. android中实现Parcelable序列化步骤

    import java.io.Serializable; import java.text.DecimalFormat; import android.os.Parcel; import androi ...

  10. 【树形DP/搜索】BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会

    1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 793  Solved: 354[Sub ...