lintcode:最大子数组差
题目
最大子数组差
给定一个整数数组,找出两个不重叠的子数组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:最大子数组差的更多相关文章
- lintcode-45-最大子数组差
45-最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 注意事项 子数组最少包含一个数 样例 给出 ...
- C++:最大子数组差
最大子数组差 内存限制:128 MiB 时间限制:1000 ms 题目描述: 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B) ...
- lintcode :最大子数组
题目: 最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 ...
- lintcode 最大子数组III
题目描述 给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大.每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 注意事项 子数组最少包含一个数 样例 给出数组 [-1 ...
- LintCode-最大子数组差
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 您在真实的面试中是否遇到过这个题? Yes 例子 给出数组[1 ...
- lintcode:最大子数组II
题目 最大子数组 II 给定一个整数数组,找出两个不重叠子数组使得它们的和最大. 每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 样例 给出数组[1, 3, -1, 2, -1, 2], ...
- 最大子数组(LintCode)
最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 注意 子数 ...
- lincode.41 最大子数组
最大子数组 描述 笔记 数据 评测 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? ...
- lintcode-42-最大子数组 II
42-最大子数组 II 给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大. 每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 注意事项 子数组最少包含一个数 样例 给出数组 [1 ...
随机推荐
- ubuntu 14.04 下 安装samba 及SSH 服务端的方法
之前说了 FTP服务器的搭建:http://www.cnblogs.com/bcsflilong/p/4200139.html 今天说一下samba 和ssh服务器的搭建. 先说samba 吧. 在u ...
- Ping N个IP测试网络连通性
#-----------------------Smokeping移动节点-------------------##! /bin/bashecho "------------- Statin ...
- php中的常用魔术方法总结
以下是对php中的常用魔术方法进行了详细的总结介绍,需要的朋友可以过来参考下 常用的魔术方法有:__Tostring () __Call() __autoLoad() __ clone() __GET ...
- delphi的UTF8相关函数
delphi的UTF8相关函数 AnsiToUtf8 function Converts a string encoded in Ansi to UTF-8. PUCS4Chars function ...
- springboot pom 引用集合
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</arti ...
- 从零开始学ios开发(九):Swapping Views
这篇的内容是切换Views,也是上一篇中提到的第三种当iphone发生旋转后改变布局的方式,先回顾一下上一篇中提到的三种方式 1.使用Autosizing 2.写code 3.重新弄个View,替换原 ...
- 微软职位内部推荐-Senior Software Development Engineer
微软近期Open的职位: Job posting title: Senior Software Development Engineer Location: China, Beijing Divisi ...
- nodejs mongodb
27017 nodejs指定vsisual studio版本 npm install mongodb --msvs_version=2013 npm install mongoose --msvs_v ...
- 打造自己的程序员品牌(摘自Infoq)
John Sonmez是Simple Programmer的创始人.作者与程序员,关注于如何让复杂的事情变得简单.他是一位专业的软件开发者.架构师与讲师,感兴趣的领域包括测试驱动开发.如何编写整洁的代 ...
- Ubuntu下安装配置zsh和oh my zsh
zsh优势:自动补全功能强大和很高的可配置性 1.查看当前系统装了哪些shell cat /etc/shells 2.当前正在运行的是哪个版本的shell echo $SHELL 3.安装 ...