45 最大子数组差

Posted 唐的糖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了45 最大子数组差相关的知识,希望对你有一定的参考价值。

原题网址:https://www.lintcode.com/problem/maximum-subarray-difference/description

描述

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

返回这个最大的差值。

子数组最少包含一个数

您在真实的面试中是否遇到过这个题?  

样例

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

挑战

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

 

思路:两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大,即是说其中一个最大,另一个最小。

顺着最大子数组Ⅱ的解法,定义四个数组leftMax,leftMin,rightMax,rightMin,分别保存0~i的最大子数组和、最小子数组和以及i+1~n-1的最大子数组和、最小子数组和;

遍历,计算leftMax - rightMin 与 rightMax - leftMin 的最大值,将两者中较大的一个return出去。

 

AC代码:

class Solution {
public:
    /**
     * @param nums: A list of integers
     * @return: An integer indicate the value of maximum difference between two substrings
     */
    int maxDiffSubArrays(vector<int> &nums) {
        // write your code here
        int n=nums.size();
     if (n==0)
     {
         return 0;
     }
     vector<int> leftMax(n,0);
     vector<int> leftMin(n,0);
     vector<int> rightMax(n,0);
     vector<int> rightMin(n,0);
     int i=0,tempsum1,tempsum2,maxsum,minsum;

     leftMax[0]=leftMin[0]=maxsum=minsum=nums[0];
     tempsum1=tempsum2=0;
     for (i=0;i<n;i++)
     {
         tempsum1+=nums[i];
         tempsum2+=nums[i];
         if (tempsum1>maxsum)
         {
             maxsum=tempsum1;
         }
         if (tempsum1<0)
         {
             tempsum1=0;
         }
         if (tempsum2<minsum)
         {
             minsum=tempsum2;
         }
         if (tempsum2>0)
         {
             tempsum2=0;
         }
         leftMax[i]=maxsum;
         leftMin[i]=minsum;
     }

     rightMax[n-1]=rightMin[n-1]=maxsum=minsum=nums[n-1];
     tempsum1=tempsum2=0;

     for (i=n-1;i>0;i--)
     {
         tempsum1+=nums[i];
         tempsum2+=nums[i];
         if (tempsum1>maxsum)
         {
             maxsum=tempsum1;
         }
         if (tempsum1<0)
         {
             tempsum1=0;
         }
         if (tempsum2<minsum)
         {
             minsum=tempsum2;
         }
         if (tempsum2>0)
         {
             tempsum2=0;
         }
         rightMax[i-1]=maxsum;
         rightMin[i-1]=minsum;
     }

     int diff1=leftMax[0]-rightMin[0];
     int diff2=rightMax[0]-leftMin[0];
     for (i=1;i<n-1;i++)
     {
         if (leftMax[i]-rightMin[i]>diff1)
         {
             diff1=leftMax[i]-rightMin[i];
         }
         if (rightMax[i]-leftMin[i]>diff2)
         {
             diff2=rightMax[i]-leftMin[i];
         }
     }
     int diff=max(diff1,diff2);
     return diff;
    }
};

 

 

 

 

以上是关于45 最大子数组差的主要内容,如果未能解决你的问题,请参考以下文章

LintCode-最大子数组差

leetcode 1438. 绝对差不超过限制的最长连续子数组----双指针篇3,滑动窗口篇2

滑动窗口-BST-单调队列-1438. 绝对差不超过限制的最长连续子数组

4.1 最大子数组问题

最大连续序列和,积以及不相交数组和之差最大

返回一个整数数组中最大子数组的和--环形