LintCode 45 最大子数组差

来源:互联网 发布:星际争霸mac版 编辑:程序博客网 时间:2024/06/10 02:42

题目:maxDiffSubArrays


要求:

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

样例:

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

算法要求:

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

解题思路:

第一次,找每点的左边最大和右边最小,最后比较差值的绝对值,
第二次,找每点的左边最小和右边最大,最后比较差值的绝对值。

算法如下:

    int maxDiffSubArrays(vector<int> nums) {        // write your code here        int size = nums.size();        int num[size];        int max = nums[0];        int sum = 0;        for (int i = 0; i < size - 1; i++) {            sum += nums[i];            if (sum > max) {                max = sum;            }            num[i] = max;            if (sum < 0) {                sum = 0;            }        }        int min = nums[size - 1];        sum = 0;        for (int j = size - 1; j > 0; j--) {            sum += nums[j];            if (sum < min) {                min = sum;            }            num[j - 1] -= min;            if (sum > 0) {                sum = 0;            }        }        int am = -1;        for (int i = 0; i < size - 1; i++) {            if (am < abs(num[i])) {                am = abs(num[i]);            }        }        max = nums[size - 1];        sum = 0;        for (int i = size - 1; i > 0; i--) {            sum += nums[i];            if (sum > max) {                max = sum;            }            num[i - 1] = max;            if (sum < 0) {                sum = 0;            }        }        min = nums[0];        sum = 0;        for (int j = 0; j < size - 1; j++) {            sum += nums[j];            if (sum < min) {                min = sum;            }            num[j] -= min;            if (sum > 0) {                sum = 0;            }        }        for (int i = 0; i < size - 1; i++) {            if (am < abs(num[i])) {                am = abs(num[i]);            }        }        return am;    }
0 0
原创粉丝点击