C++ 如何在C+中降低此解决方案的时间复杂性+;?
给定整数数组nums,找到具有最大和的连续子数组(至少包含一个数字),并返回其和 例如: 输入:[-2,1,-3,4,-1,2,1,-5,4], 产出:6 说明:[4,-1,2,1]的最大和=6C++ 如何在C+中降低此解决方案的时间复杂性+;?,c++,algorithm,vector,data-structures,dsa,C++,Algorithm,Vector,Data Structures,Dsa,给定整数数组nums,找到具有最大和的连续子数组(至少包含一个数字),并返回其和 例如: 输入:[-2,1,-3,4,-1,2,1,-5,4], 产出:6 说明:[4,-1,2,1]的最大和=6 class Solution { public: int maxSubArray(vector<int>& nums) { int max=INT_MIN; int result; int i
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;
}
};
类解决方案{
公众:
int最大子数组(向量和nums){
int max=int_MIN;
int结果;
int i,j;
如果(nums.size()==1)
返回nums[0];
如果(nums.size()==0)
返回0;
对于(i=0;i以下),这仅在一个循环中实现,从。
通过一点簿记,您还可以使用summax\u sou\u 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;
}
#包括
#包括
使用名称空间std;
整数最大子数组和(整数a[],整数大小)
{
int max_so_far=int_MIN,max_ending_here=0;
对于(int i=0;i
请查看此链接:
这里有两个有效的解决方案
其主要思想是保留一个maxSum变量,该变量将跟踪到目前为止看到的最大和。您还需要一个currentSum变量来跟踪当前窗口中的和。每次向当前和添加正数时,将其与maxSum进行比较,如果currentSum>maxSum,则更新maxSum。这可以使用
#include//max函数需要此头文件。
类解决方案
{
公众:
int最大子数组(向量和nums){
内部温度=0;
int max_sum=0;
对于(It i=0;这是从某个竞赛/挑战/竞争性编码/黑客站点中读取的。是吗?如果你的目标是学习C++,你就不会在那里学到任何东西。在几乎所有的情况下,像这个一样,正确的解决方案是基于数学或编程技巧。如果你不知道窍门是什么,并试图编写一个蛮力的方法,程序运行缓慢,失败是因为这个原因。如果你想学习C++,你将无法从毫无意义的在线竞赛网站中学习任何东西。你通过使用不同的算法来“优化”。(这看起来像是一个动态编程问题,所以我从那里开始。)是的,我认为这是一个dp问题,只是想寻找一种方法,我可以在给定的时间内解决它,而不使用dp