Lintcode 最大子数组 II
2017-03-28 22:42
337 查看
给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
注意事项
子数组最少包含一个数
您在真实的面试中是否遇到过这个题?
Yes
样例
给出数组
这两个子数组分别为
挑战
要求时间复杂度为 O(n)
标签
贪心 枚举法 LintCode
版权所有 数组 子数组 前后遍历
这题的主要想法就是从前面和后面分别开始 如上篇“最大子数组” 一样计算出每一个节点为最后一个节点时的最大和并存入left和right数组,然后通过计算两个数组left[i]和right[i+1]最大的和即为所求。(为了用最大数组的结果写的比较乱)
class Solution {
public:
/**
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
void maxSubArray(vector<int> &nums,int first,int end,int flag,vector<int> &array) {
// write your code here
int sum=nums[first];
int max=nums[first];
int i;
if(flag==1)
i=first+1;
else
i=first-1;
for(;flag==1?i<=end:i>=end;){
if(sum<=0){
sum=nums[i];
}
else
sum+=nums[i];
if(max<sum)
max=sum;
// cout<<max<<endl;
array.push_back(max);
if(flag==1)
i++;
else
i--;
}
}
int maxTwoSubArrays(vector<int> nums) {
// write your code here
if(nums.empty())
return 0;
int n=nums.size();
int max;
int sum;
4000
vector<int> left,right;
left.push_back(nums[0]);
right.push_back(nums[n-1]);
maxSubArray(nums,0,n-1,1,left);
maxSubArray(nums,n-1,0,0,right);
for(int i=0;i<n-1;i++){
sum=left[i]+right[n-i-2];
if(i==0)
max=sum;
else if(max<sum)
max=sum;
}
return max;
}
};
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
注意事项
子数组最少包含一个数
您在真实的面试中是否遇到过这个题?
Yes
样例
给出数组
[1, 3, -1, 2, -1, 2]
这两个子数组分别为
[1, 3]和
[2, -1, 2]或者
[1, 3, -1, 2]和
[2],它们的最大和都是
7
挑战
要求时间复杂度为 O(n)
标签
贪心 枚举法 LintCode
版权所有 数组 子数组 前后遍历
这题的主要想法就是从前面和后面分别开始 如上篇“最大子数组” 一样计算出每一个节点为最后一个节点时的最大和并存入left和right数组,然后通过计算两个数组left[i]和right[i+1]最大的和即为所求。(为了用最大数组的结果写的比较乱)
class Solution {
public:
/**
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
void maxSubArray(vector<int> &nums,int first,int end,int flag,vector<int> &array) {
// write your code here
int sum=nums[first];
int max=nums[first];
int i;
if(flag==1)
i=first+1;
else
i=first-1;
for(;flag==1?i<=end:i>=end;){
if(sum<=0){
sum=nums[i];
}
else
sum+=nums[i];
if(max<sum)
max=sum;
// cout<<max<<endl;
array.push_back(max);
if(flag==1)
i++;
else
i--;
}
}
int maxTwoSubArrays(vector<int> nums) {
// write your code here
if(nums.empty())
return 0;
int n=nums.size();
int max;
int sum;
4000
vector<int> left,right;
left.push_back(nums[0]);
right.push_back(nums[n-1]);
maxSubArray(nums,0,n-1,1,left);
maxSubArray(nums,n-1,0,0,right);
for(int i=0;i<n-1;i++){
sum=left[i]+right[n-i-2];
if(i==0)
max=sum;
else if(max<sum)
max=sum;
}
return max;
}
};
相关文章推荐
- [Lintcode]Maximum Subarray II 最大子数组 II
- lintcode-42-最大子数组 II
- 最大子数组 II-LintCode
- LintCode:最大子数组 II
- LintCode-最大子数组 II
- lintcode(42)最大子数组 II
- lintcode-删除排序数组中的重复数字II-101
- LintCode-合并排序数组 II
- [LintCode] Intersection of Two Arrays II 两个数组相交之二
- LintCode 548 两数组的交 II
- [LintCode] Maximum Subarray 最大子数组
- LintCode【两数组的交II】
- lintcode删除排序数组中的重复数字 II
- LintCode-合并排序数组 II
- [Lintcode]Maximum Subarray III最大子数组 III
- LintCode-最大子数组 III
- lintcode 容易题:Merge Sorted Array II 合并排序数组 II
- lintcode 容易题:Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II
- LintCode(101)删除排序数组中的重复数字 II
- lintcode-合并排序数组II-64