Maximum Subarray Difference Solution
2015-10-22 17:39
267 查看
这道题感觉非常有意思,值得记录一下。思路来源:https://codesolutiony.wordpress.com/2015/05/28/lintcode-maximum-subarray-difference/
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
int len = nums.size();
int[] maxLeft = new int[len], minLeft = new int[len];
// sweep from left
int max = nums.get(0), min = nums.get(0), localmax = max, localmin = max;
maxLeft[0] = minLeft[0] = max;
for(int i = 1; i < len; i ++){
localmax = Math.max(nums.get(i), localmax+nums.get(i));
localmin = Math.min(nums.get(i), localmin+nums.get(i));
maxLeft[i] = Math.max(max, localmax);
minLeft[i] = Math.min(min, localmin);
}
//sweep from right
max = min = nums.get(len-1);
int res = Math.max(max-minLeft[len-2], maxLeft[len-2]-min);
localmax = localmin = nums.get(len-1);
for(int i = len-2; i > 0; i--){
localmax = Math.max(nums.get(i), localmax+nums.get(i));
localmin = Math.min(nums.get(i), localmin+nums.get(i));
int maxRight_i = Math.max(max, localmax);
int minRight_i = Math.min(min, localmin);
int tmp = Math.max(maxRight_i - minLeft[i-1], maxLeft[i-1] - minRight_i);
res = Math.max(tmp, res);
}
return res;
}
}
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
int len = nums.size();
int[] maxLeft = new int[len], minLeft = new int[len];
// sweep from left
int max = nums.get(0), min = nums.get(0), localmax = max, localmin = max;
maxLeft[0] = minLeft[0] = max;
for(int i = 1; i < len; i ++){
localmax = Math.max(nums.get(i), localmax+nums.get(i));
localmin = Math.min(nums.get(i), localmin+nums.get(i));
maxLeft[i] = Math.max(max, localmax);
minLeft[i] = Math.min(min, localmin);
}
//sweep from right
max = min = nums.get(len-1);
int res = Math.max(max-minLeft[len-2], maxLeft[len-2]-min);
localmax = localmin = nums.get(len-1);
for(int i = len-2; i > 0; i--){
localmax = Math.max(nums.get(i), localmax+nums.get(i));
localmin = Math.min(nums.get(i), localmin+nums.get(i));
int maxRight_i = Math.max(max, localmax);
int minRight_i = Math.min(min, localmin);
int tmp = Math.max(maxRight_i - minLeft[i-1], maxLeft[i-1] - minRight_i);
res = Math.max(tmp, res);
}
return res;
}
}
相关文章推荐
- css3转盘抽奖示例-转指针
- jQuery事件之鼠标事件
- 让你的MyEclipse自动提示jquery和extjs等
- DIV横向排列_CSS如何让多个div盒子并排同行显示
- atom编辑器的使用
- Jquery初始--遍历
- jquery中把字符串转换为数字
- js Table鼠标滑过变色,单击变色,隐藏某列的方法
- CSS:透明度 opacity与rgba()的区别
- Jquery初始--文本格式
- nodejs里的module.exports和exports的关系
- 通达OA2015-工作流前端触发器的使用
- js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度
- (一)页面中引入seajs以及模块的加载和启动
- 学习笔记 一步步了解webpack
- ReactJs 使用心得
- html标签的嵌套规则
- input简单操作
- js显示当前日期时间和星期几
- jquery ajax