首页 > 代码库 > LintCode-最大子数组差
LintCode-最大子数组差
给定一个整数数组,找出两个不重叠的子数组A和B,使两个子数组和的差的绝对值|SUM(A) - SUM(B)|最大。
返回这个最大的差值。
您在真实的面试中是否遇到过这个题?Yes
例子
给出数组[1, 2, -3, 1]。返回 6
注意
子数组最少包括一个数
挑战
标签 Expand 时间复杂度为O(n)。空间复杂度为O(n)
相关题目 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; } };
LintCode-最大子数组差
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。