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

 

你可能感兴趣的:(array)