• 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;
        }
    };
    


  • 相关阅读:
    flex 开发air 2.0 sdk 设置
    后来的我们
    岷县蓓蕾中学开展读书活动侧记
    c# 中文件操作 文件被锁住的问题
    wcf中配置文件
    ASP.NET中的session存储模式运用
    net中用户登录验证和基页面类
    jquery文件上传控件 Uploadify
    MongoDB基本介绍及一些用法
    用SQL删除重复记录的N种方法
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6944174.html
Copyright © 2020-2023  润新知