zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    CSP-S 2019游记
    南校五天集训游记
    web.xml模板
    JDBC Template的基本使用
    Spring AOP(3)使用AspectJ xml配置
    Spring AOP(2)使用AspectJ注解
    Spring Aop(面向切面编程)
    Spring Bean管理3(xml与注解混合使用)
    Python核心技术与实战——十二|Python的比较与拷贝
    test
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9085570.html
Copyright © 2011-2022 走看看