LintCode-最大子数组差

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

返回这个最大的差值。

您在真实的面试中是否遇到过这个题?

Yes

样例

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

注意

子数组最少包含一个数

挑战

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

标签 Expand

相关题目 Expand

分析:这题还是有点难度的感觉,首先直觉是可以套用求最大字数组和的代码,其次,求差的绝对值最大,那么求出子数组和的最大最小值,然后相减就行,但是有可能是左边最大右边最小,也可能是左边最小右边最大。

代码:

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 x1 = deal(nums);
        reverse(nums.begin(),nums.end());
        int x2 = deal(nums);
        return max(x1,x2);
    }
    int deal(vector<int> nums)
    {
        int n = nums.size();
        vector<int> leftMax(n,0);
        vector<int> rightMin(n,0);
        int sum = 0;
        int mx = INT_MIN;
        for(int i=0;i<n;i++)
        {
            sum+=nums[i];
            mx = max(sum,mx);
            if(sum<0)
                sum = 0;
            leftMax[i] = mx;
        }
        sum = 0;
        mx = INT_MAX;
        for(int i=n-1;i>=0;i--)
        {
            sum+=nums[i];
            mx = min(sum,mx);
            if(sum>0)
                sum = 0;
            rightMin[i]=mx;
        }
        int ret = 0;
        for(int i=1;i<n;i++)
        {
            ret = max(ret,abs(leftMax[i-1]-rightMin[i]));
        }
        return ret;
    }
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-28 17:27:05

LintCode-最大子数组差的相关文章

lintcode 中等题:maximum subarray difference 最大子数组差

题目 最大子数组差 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 样例 给出数组[1, 2, -3, 1],返回 6 注意 子数组最少包含一个数 挑战 时间复杂度为O(n),空间复杂度为O(n) 解题 刚做了数组中两个子数组和的最大值,这一题是求差,感觉上题的求解思想应该是可以用的 A B 分别是两个子数组的和,则: 所以 当A>B 的时候A越大越好 B越小越好 当A<B 的时候B越大越好 A越小越好

45 最大子数组差

原题网址:https://www.lintcode.com/problem/maximum-subarray-difference/description 描述 给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大. 返回这个最大的差值. 子数组最少包含一个数 您在真实的面试中是否遇到过这个题?  是 样例 给出数组[1, 2, -3, 1],返回 6 挑战 时间复杂度为O(n),空间复杂度为O(n) 思路:两个子数组和的差的绝对值|S

lintcode 最大子数组III

题目描述 给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大.每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 注意事项 子数组最少包含一个数 样例 给出数组 [-1,4,-2,3,-2,3] 以及 k = 2,返回 8 思路 dp[i][j] = max(dp[x][j-1]+maxs[x+1][i]) dp[i][j] 表示前 i 个数中 j 个子数组的最大值, maxs[i][j] 表示 第i个数到第j个数中最大子数组的和. 代码 public class

LintCode Python 简单级题目 最小子数组和、最大子数组和

题目1 最小子数组 描述: 给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 注意事项 子数组最少包含一个数字 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组[1, -1, -2, 1],返回 -3 标签 LintCode 版权所有 子数组 贪心 数组 题目2 最大子数组 描述: 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组[?2,2,?3,4,?1,2,1,?5,

lintcode 中等题:maximum subarray最大子数组II

题目 最大子数组 II 给定一个整数数组,找出两个不重叠子数组使得它们的和最大. 每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组[1, 3, -1, 2, -1, 2],这两个子数组分别为[1, 3]和[2, -1, 2]或者[1, 3, -1, 2]和[2],它们的最大和都是7 注意 子数组最少包含一个数 挑战 要求时间复杂度为O(n) 解题 最大子数组I 这个题目是求一个数组中一个最大子数组的和,而本题目是求数组中的前

最大子数组(LintCode)

最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6 注意 子数组最少包含一个数 挑战 要求时间复杂度为O(n) 若当前和小于0,那么加到下一个数上必然会使和减小,此时抛弃这个和重新求和.当遇到一个负数时,记录下当前已知的最大和. 总耗时: 2721 ms 1 public class Solution { 2 /** 3 * @param nums: A li

LintCode刷题---最大子数组

描述: 给定一个整数数组, 找到一个具有最大和的子数组, 返回其最大和. 样例: 输入: [-2, 2, -3, 4, -1, 2, 1, -5, 3] 输出:   6 解释:   符合要求得子数组为[4, -1, 2, 1], 其最大和为6 解题: 难点分析: 注意数组中有三种情况, 全为负数, 全为正数, 有正有负.   还需要注意得是, 这里得最大子数组是最大连续得子数组, 不是随意组合得最大子数组 两种方法解题: 1. 暴力解题: 两层循环,遍历所有直接找到最大的子数组. public

lincode.41 最大子数组

最大子数组 描述 笔记 数据 评测 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Facebook Google T

一维数组头尾相连求最大子数组

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1. 设计思想: 因为已经写过了一维数组的求最大子数组程序.所以只是在原程序上进行修改.首先产生随机数数组,然后进行计算,因为要求时间复杂度