45.Maximum Subarray Difference-最大子数组差(中等题)
来源:互联网 发布:ps嘴唇上色数据 编辑:程序博客网 时间:2024/06/04 18:43
最大子数组差
题目
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。注意事项
子数组最少包含一个数样例
给出数组[1, 2, -3, 1],返回 6
挑战
时间复杂度为O(n),空间复杂度为O(n)
题解
沿用42.Maximum Subarray II-最大子数组 II(中等题)的思路,求出左右子数组的最大值和最小值,再求差的最大绝对值。由于无法判断最大子数组和最小子数组分别出现在左边还是右边,所以需要将数组反转后再求一次,最后选出最大值。
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) { int a = getMaxAbs(nums); reverse(nums,0,nums.length-1); return Math.max(a,getMaxAbs(nums)); } private int getMaxAbs(int[] nums) { int size = nums.length; int[] left = new int[size]; int[] right = new int[size]; int max = Integer.MIN_VALUE; for(int i = 0,sum = 0; i < size; i++) { sum += nums[i]; max = Math.max(max, sum); if(sum < 0) { sum = 0; } left[i] = max; } max = Integer.MAX_VALUE; for(int i = size - 1,sum = 0; i >= 0; i--) { sum += nums[i]; max = Math.min(max, sum); if(sum > 0) { sum = 0; } right[i] = max; } max = Integer.MIN_VALUE; for(int i = 0; i < size - 1; i++) { max = Math.max(max, Math.abs(left[i] - right[i + 1])); } return max; } private void reverse(int[] arr, int start, int end) { while (start < end) { int temp = arr[end]; arr[end--] = arr[start]; arr[start++] = temp; } }}
Last Update 2016.9.29
0 0
- 45.Maximum Subarray Difference-最大子数组差(中等题)
- ***[Lintcode]Maximum Subarray Difference 最大子数组差
- 42.Maximum Subarray II-最大子数组 II(中等题)
- 191.Maximum Product Subarray-乘积最大子序列(中等题)
- Maximum Subarray(最大子数组)
- 最大子数组(maximum subarray)问题
- 41.Maximum Subarray-最大子数组(容易题)
- Maximum Subarray [最大子数组]
- Maximum Subarray 最大子数组和(连续)@LeetCode
- LeetCode | Maximum Subarray(连续最大子数组)
- LeetCode OJ 之 Maximum Subarray (最大子数组)
- 最大子数组(The maximum-subarray problem)
- Maximum subarray -- 最大子数组问题(C++)
- 最大子数组和(The Maximum Subarray)
- LeetCode 53. Maximum Subarray(最大子数组)
- 【DP】最大子数组Maximum Subarray
- 最大子数组和 (Maximum Subarray)
- Maximum Subarray-最大连续子数组和
- python技巧(2):--python cookbook学习笔记
- linux内核4.2.x实现自定义系统调用
- Hello world!
- 洛谷 3144
- 关于flag布尔数组标记 和 set 标记 的一些想法
- 45.Maximum Subarray Difference-最大子数组差(中等题)
- POJ 3277 线段树+扫描线
- 全组合
- 【Linux 系统编程】常用的一些基本命令
- 什么是超参数
- POJ 2528 线段树
- 51nod 1456【强连通,缩点,并查集】
- 超全!整理常用的iOS第三方资源
- C++(类和对象二)