最大子數組差 - LintCode

描述
給定一個整數數組,找出兩個不重疊的子數組A和B,使兩個子數組和的差的絕對值|SUM(A) - SUM(B)|最大。

返回這個最大的差值。

子數組最少包含一個數

樣例
給出數組[1, 2, -3, 1],返回 6

挑戰
時間複雜度爲O(n),空間複雜度爲O(n)

思路
構建相應的數組ForMax[i]表示從nums[0]到nums[i]的子數組和的最大值,ForMin[i]表示從nums[0]到nums[i]的子數組和的最小值,RevMax[i]表示從nums[i]到nums[len-1]的子數組和的最大值,RevMin[i]表示從nums[i]到nums[len-1]的子數組和的最小值。最終的結果取ForMax[i] - RevMin[i + 1]與RevMax[j] - ForMin[j - 1]的最大值

#ifndef C45_H
#define C45_H
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
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
        if (nums.empty())
            return 0;
        int len = nums.size();
        //ForMax[i]表示從nums[0]到nums[i]的子數組和的最大值
        //ForMin[i]表示從nums[0]到nums[i]的子數組和的最小值
        //RevMax[i]表示從nums[i]到nums[len-1]的子數組和的最大值
        //RevMin[i]表示從nums[i]到nums[len-1]的子數組和的最小值
        vector<int> ForMax(len), ForMin(len), RevMax(len), RevMin(len);
        ForMax[0] = nums[0];
        ForMin[0] = nums[0];
        RevMax[len - 1] = nums[len - 1];
        RevMin[len - 1] = nums[len - 1];
        int res = INT_MIN;
        int Max = nums[0], Min = nums[0];
        int curMax = nums[0], curMin = nums[0];
        for (int i = 1; i < len; ++i)
        {
            if (curMax>0)
                curMax += nums[i];
            else
                curMax = nums[i];
            if (curMax > Max)
                Max = curMax;
            ForMax[i] = Max;
            if (curMin < 0)
                curMin += nums[i];
            else
                curMin = nums[i];
            if (curMin < Min)
                Min = curMin;
            ForMin[i] = Min;
        }
        Max = nums.back(), Min = nums.back();
        curMax = Max, curMin = Min;
        for (int i = len - 2; i >= 0; --i)
        {
            if (curMax>0)
                curMax += nums[i];
            else
                curMax = nums[i];
            if (curMax > Max)
                Max = curMax;
            RevMax[i] = Max;
            if (curMin < 0)
                curMin += nums[i];
            else
                curMin = nums[i];
            if (curMin < Min)
                Min = curMin;
            RevMin[i] = Min;
        }
        //計算ForMax[i] - RevMin[i + 1]
        for (int i = 0; i < len - 1; ++i)
        {
            res = max(res, ForMax[i] - RevMin[i + 1]);
        }
        //計算RevMax[i] - ForMin[i - 1]
        for (int i = len - 1; i > 0; --i)
        {
            res = max(res, RevMax[i] - ForMin[i - 1]);
        }
        return res;
    }
};

#endif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章