zoukankan      html  css  js  c++  java
  • lintcode-45-最大子数组差

    45-最大子数组差

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

    注意事项

    子数组最少包含一个数

    样例

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

    挑战

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

    标签

    贪心 枚举法 LintCode 版权所有 数组 子数组 前后遍历

    思路

    复用“求最大字数组和”的代码,求出从左自右遍历数的最大子数组maxLeft、最小子数组minLeft和从右自左遍历数的最大子数组maxRight、最小子数组minRight。然后求出maxLeft与minRight的最大差,minLeft与maxRight的最大差。即可得出最大子数组差。

    code

    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 size = nums.size(), i = 0;
            int sum = 0, maxValue = 0;
            int dec = 0, minValue = 0;
            
            int *maxLeft = new int[size];   
            int *minLeft = new int[size];
            int *maxRight = new int[size];
            int *minRight = new int[size];
    
            sum = maxValue = maxLeft[0] = nums[0];
            for(i=1; i<size; i++) {
                if(sum < 0) {
                    sum = nums[i];
                }
                else {
                    sum += nums[i];
                }
                if(sum > maxValue) {
                    maxValue = sum;
                }
                maxLeft[i] = maxValue;
            }
            sum = maxValue = maxRight[size-1] = nums[size-1];
            for(i=size-2; i>=0; i--) {
                if(sum < 0) {
                    sum = nums[i];
                }
                else {
                    sum += nums[i];
                }
                if(sum > maxValue) {
                    maxValue = sum;
                }
                maxRight[i] = maxValue;
            }
    
            dec = minValue = minLeft[0] = nums[0];
            for(i=1; i<size; i++) {
                if(dec > 0) {
                    dec = nums[i];
                }
                else {
                    dec += nums[i];
                }
                if(dec < minValue) {
                    minValue = dec;
                }
                minLeft[i] = minValue;
            }
            dec = minValue = minRight[size-1] = nums[size-1];
            for(i=size-2; i>=0; i--) {
                if(dec > 0) {
                    dec = nums[i];
                }
                else {
                    dec += nums[i];
                }
                if(dec < minValue) {
                    minValue = dec;
                }
                minRight[i] = minValue;
            }
            
            int result1 = 0x80000000;
            int result2 = 0x80000000;
            for(i=0; i<size-1; i++) {
                result1 = (result1 > maxLeft[i]-minRight[i+1])?result1:( maxLeft[i]-minRight[i+1]);
                result2 = (result2 > maxRight[i+1]-minLeft[i])?result2:( maxRight[i+1]-minLeft[i]);
            }
    
            
            delete[] maxLeft;
            delete[] minLeft;
            delete[] maxRight;
            delete[] minRight;
    
            return (result1 > result2)?result1:result2;
        }
    };
    
  • 相关阅读:
    Flutter中的剪裁
    flutter设置沉浸式状态栏
    flutter设置主题色和状态栏颜色
    Flutter更改状态栏颜色
    前端基础之JavaScript
    前端基础之CSS
    前端基础之初识 HTML
    socket及其相关(续篇)
    初识socket
    面向对象及其相关
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7082044.html
Copyright © 2011-2022 走看看