如何降低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。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...