如何解决如何降低C ++中此解决方案的时间复杂度?
给出一个整数数组nums,找到具有最大总和的连续子数组(至少包含一个数字)并返回其总和。
示例:
输入:[-2,1,-3,4,-1,2,1,-5,4], 输出6 说明:[4,-1,1]的总和= 6。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int max=INT_MIN;
int result;
int i,j;
if(nums.size()==1)
return nums[0];
if(nums.size()==0)
return 0;
for(i=0;i<nums.size();i++)
{
for(j=i;j<nums.size();j++)
{
result=accumulate(nums.begin()+i,nums.begin()+j+1,0);
if(result>max)
max=result;
}
}
return max;
}
};
它已通过200/202个测试用例,但在其余2个测试用例上都存在时间限制扩展问题。我该如何优化呢?
解决方法
这可以使用Kadane's Algorithm完成。
#include<algorithm> //this header file is required for max function.
class Solution
{
public:
int maxSubArray(vector<int>& nums) {
int temp=0;
int max_sum=0;
for(int i=0;i<nums.size();i++)
{
temp=max(temp+nums[i],nums[i]);
max_sum=max(temp,max_sum);
}
return max_sum;
}
};
,
下面,这是从one the first googled results开始的仅一个循环。
只需少量记账,您还可以保持总和为max_so_far
的最大子序列的第一个和最后一个元素位置。
#include<iostream>
#include<climits>
using namespace std;
int maxSubArraySum(int a[],int size)
{
int max_so_far = INT_MIN,max_ending_here = 0;
for (int i = 0; i < size; i++)
{
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
,
请查看以下链接:https://www.geeksforgeeks.org/largest-sum-contiguous-subarray/
这里有高效的解决方案。
主要思想是保留maxSum变量,该变量将跟踪到目前为止所看到的最大和。您还需要一个currentSum变量,用于跟踪当前窗口中的总和。每次向当前总和添加一个正数时,将其与maxSum比较,如果currentSum> maxSum,则更新maxSum。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。