• LintCode "Maximum Subarray Difference"


    A variantion to "largestsmallest consecutive subarray". Idea is, at position i, the current max diff is max(max_left[i] - min_right[i+1], max_right[i + 1] - min_left[i]). Yes you can see boiler-plate code below. I'm lazy to make it shorter now.

    class Solution {
        void largest_l2r(vector<int> &A, vector<int> &ret)
        {
        size_t len = A.size();
        ret.resize(len);
        
        int csum = A[0], sofar = A[0];
        
        ret[0] = A[0];    
        for (int i = 1; i < len; i++)
        {
            int nsum = csum + A[i];
            if (A[i] > nsum)
            {
            csum = A[i];
            }
            else
            {
            csum = nsum;
            }
            sofar = max(sofar, csum);
            ret[i] = sofar;
        }
        }
        void smallest_l2r(vector<int> &A, vector<int> &ret)
        {
        size_t len = A.size();
        ret.resize(len);
        
        int csum = A[0], sofar = A[0];
        
        ret[0] = A[0];    
        for (int i = 1; i < len; i++)
        {
            int nsum = csum + A[i];
            if (A[i] < nsum)
            {
            csum = A[i];
            }
            else
            {
            csum = nsum;
            }
            sofar = min(sofar, csum);
            ret[i] = sofar;
        }
        }
        void largest_r2l(vector<int> &A, vector<int> &ret)
        {
        size_t len = A.size();
        ret.resize(len);
        
        int csum = A.back(), sofar = A.back();
        
        ret[len - 1] = A.back();    
        for (int i = len - 2; i >= 0; i --)
        {
            int nsum = csum + A[i];
            if (A[i] > nsum)
            {
            csum = A[i];
            }
            else
            {
            csum = nsum;
            }
            sofar = max(sofar, csum);
            ret[i] = sofar;
        }
        }
        void smallest_r2l(vector<int> &A, vector<int> &ret)
        {
        size_t len = A.size();
        ret.resize(len);
        
        int csum = A.back(), sofar = A.back();
        
        ret[len - 1] = A.back();    
        for (int i = len - 2; i >= 0; i --)
        {
            int nsum = csum + A[i];
            if (A[i] < nsum)
            {
            csum = A[i];
            }
            else
            {
            csum = nsum;
            }
            sofar = min(sofar, csum);
            ret[i] = sofar;
        }
        }
    public:
        /**
         * @param nums: A list of integers
         * @return: An integer indicate the value of maximum difference between two
         *          Subarrays
         */
        int maxDiffSubArrays(vector<int> nums) {
            vector<int> max_l2r, max_r2l;
        largest_l2r(nums, max_l2r);
        largest_r2l(nums, max_r2l);
        
        vector<int> min_l2r, min_r2l;
        smallest_l2r(nums, min_l2r);
        smallest_r2l(nums, min_r2l);
        
        int ret = INT_MIN;
        for(int i = 0; i < nums.size() - 1; i ++)
        {
            int r1 = max_l2r[i] - min_r2l[i + 1];
            int r2 = max_r2l[i + 1] - min_l2r[i];
            ret = max(ret, max(r1, r2));
        }
        return ret;
        }
    };
    View Code
  • 相关阅读:
    可能出现jdk版本的bug和eclipse修改项目jdk的版本具体步骤
    神奇的bug,解决方法就是试试...
    eclipse安装完对应的sts插件后按alt+/却不能提示属性值
    Debug it (双头DP)
    A/B Matrix (贪心+棋盘图)
    map(lowerbond等等)
    A AD 2020(前缀和,空间压缩,模拟,3维数组)
    Path Queries (并查集+ 把图/树 分成很多块来看)
    Bin Packing Problem(线段树维护最大值,map元素查找的应用)
    Lowbit(势能线段树)
  • 原文地址:https://www.cnblogs.com/tonix/p/4889335.html
Copyright © 2020-2023  润新知