1. 程式人生 > >45 最大子數組差

45 最大子數組差

list emp 包含 htm script www view between 是否

原題網址: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 最大子數組差