zoukankan      html  css  js  c++  java
  • [LintCode] Maximum Subarray Difference

    Maximum Subarray Difference

    Given an array with integers.

    Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)| is the largest.

    Return the largest difference.

    Example

    For [1, 2, -3, 1], return 6

    Note

    The subarray should contain at least one number

    Challenge

    O(n) time and O(n) space.

    左右两头扫,注意要分别记录左边最大子段和、最小子段和,右边最大子段和、最小子段和。

     1 class Solution {
     2 public:
     3     /**
     4      * @param nums: A list of integers
     5      * @return: An integer indicate the value of maximum difference between two
     6      *          Subarrays
     7      */
     8     int maxDiffSubArrays(vector<int> nums) {
     9         // write your code here
    10         if (nums.empty()) return -1;
    11         int N = nums.size();
    12         vector<int> max_sum_l(N), min_sum_l(N);
    13         int max_tmp = nums[0], min_tmp = nums[0];
    14         max_sum_l[0] = min_sum_l[0] = nums[0];
    15         for (int i = 1; i < N; ++i) {
    16             max_tmp = max(max_tmp + nums[i], nums[i]);
    17             min_tmp = min(min_tmp + nums[i], nums[i]);
    18             max_sum_l[i] = max(max_tmp, max_sum_l[i-1]);
    19             min_sum_l[i] = min(min_tmp, min_sum_l[i-1]);
    20         }
    21         vector<int> max_sum_r(N), min_sum_r(N);
    22         max_tmp = min_tmp = nums[N-1];
    23         max_sum_r[N-1] = min_sum_r[N-1] = nums[N-1];
    24         for (int i = N - 2; i >= 0; --i) {
    25             max_tmp = max(max_tmp + nums[i], nums[i]);
    26             min_tmp = min(min_tmp + nums[i], nums[i]);
    27             max_sum_r[i] = max(max_tmp, max_sum_r[i+1]);
    28             min_sum_r[i] = min(min_tmp, min_sum_r[i+1]);
    29         }
    30         int res = 0;
    31         for (int i = 0; i < N - 1; ++i) {
    32             res = max(res, abs(max_sum_l[i] - min_sum_r[i+1]));
    33             res = max(res, abs(min_sum_l[i] - max_sum_r[i+1]));
    34         }
    35         return res;
    36     }
    37 };
  • 相关阅读:
    [windbg] 进程、线程
    [Windows 驱动开发] 驱动中获取函数地址
    [DuiLib] 入坑资料收集
    [Windows 驱动开发] 获取驱动详细信息
    基于模板的SPS展示层定制
    关于工作角色的一个新的思考
    中小企业IT建设的有关思路
    定制SharePoint Portal之去除帮助链接
    大客户谈判技巧关于IT行业售前工作
    细节决定成败
  • 原文地址:https://www.cnblogs.com/easonliu/p/4583409.html
Copyright © 2011-2022 走看看