45.最大子数组差 题目链接
分析:
(1)子数组的含义:一个数组中连着的数,不能分开(自己做错的重点就在这,我给她整排序了)
(2)比较经典的dp问题,但是我给它整排序了。
开四个数组lmax[i],lmin[i]代表从左起到i位置的最大值和最小值,rmax[i],rmin[i]代表从又起到i位置的最大值和最小值。
(3)先从左遍历,变量max,min,curmax,curmin,走到i时curmax和curmin加上nums[i],再分别跟max和min比较,得到当前的最大值和最小值赋值给lmax[i],lmin[i]。如果curmax小于0或者curmin>0则说明对于后面的数,加上这些已不是最优解,所以归0。
(4)从右往左遍历,操作一样。
(5)最后i从0遍历到n-1,ans=max(ans, abs(lmax[i]-rmin[i+1])),ans=max(ans, abs(lmin[i]-rmax[i+1]))
public class Solution {
/**
* @param nums: A list of integers
* @return: An integer indicate the value of maximum difference between two substrings
*/
public int maxDiffSubArrays(int[] nums) {
// write your code here
int n = nums.length;
int[] lmax = new int[n];
int[] lmin = new int[n];
int[] rmin = new int[n];
int[] rmax = new int[n];
int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE, curmax = 0, curmin = 0;
for(int i=0;i<n;i++)
{
curmax += nums[i];
curmin += nums[i];
max = Math.max(max,curmax);
min = Math.min(min,curmin);
lmax[i] = max;
lmin[i] = min;
if(curmax<0)
curmax = 0;
if(curmin>0)
curmin = 0;
}
max = Integer.MIN_VALUE; min = Integer.MAX_VALUE; curmax = 0; curmin = 0;
for(int i=n-1; i>=0; i--)
{
curmax += nums[i];
curmin += nums[i];
max = Math.max(max,curmax);
min = Math.min(min,curmin);
rmax[i] = max;
rmin[i] = min;
if(curmax<0)
curmax = 0;
if(curmin>0)
curmin = 0;
}
int ans = Integer.MIN_VALUE;
for(int i=0;i<n-1;i++)
{
ans = Math.max(ans,Math.abs(lmax[i]-rmin[i+1]));
ans = Math.max(ans,Math.abs(lmin[i]-rmax[i+1]));
}
return ans;
}
}