码迷,mamicode.com
首页 > 编程语言 > 详细

LintCode-最大子数组差

时间:2015-06-26 21:15:29      阅读:953      评论:0      收藏:0      [点我收藏+]

标签:lintcode   面试   

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

返回这个最大的差值。

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

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

注意

子数组最少包含一个数

挑战

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

标签 Expand  

相关题目 Expand 


分析:这题还是有点难度的感觉,首先直觉是可以套用求最大字数组和的代码,其次,求差的绝对值最大,那么求出子数组和的最大最小值,然后相减就行,但是有可能是左边最大右边最小,也可能是左边最小右边最大。

代码:

class Solution {
public:
    /**
     * @param nums: A list of integers
     * @return: An integer indicate the value of maximum difference between two
     *          Subarrays
     */
    int maxDiffSubArrays(vector<int> nums) {
        // write your code here
        int x1 = deal(nums);
        reverse(nums.begin(),nums.end());
        int x2 = deal(nums);
        return max(x1,x2);
    }
    int deal(vector<int> nums)
    {
        int n = nums.size();
        vector<int> leftMax(n,0);
        vector<int> rightMin(n,0);
        int sum = 0;
        int mx = INT_MIN;
        for(int i=0;i<n;i++)
        {
            sum+=nums[i];
            mx = max(sum,mx);
            if(sum<0)
                sum = 0;
            leftMax[i] = mx;
        }
        sum = 0;
        mx = INT_MAX;
        for(int i=n-1;i>=0;i--)
        {
            sum+=nums[i];
            mx = min(sum,mx);
            if(sum>0)
                sum = 0;
            rightMin[i]=mx;
        }
        int ret = 0;
        for(int i=1;i<n;i++)
        {
            ret = max(ret,abs(leftMax[i-1]-rightMin[i]));
        }
        return ret;
    }
};


版权声明:本文为博主原创文章,未经博主允许不得转载。

LintCode-最大子数组差

标签:lintcode   面试   

原文地址:http://blog.csdn.net/wangyuquanliuli/article/details/46653443

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!