【问题标题】:How do I reduce Time Complexity of this solution in C++?如何在 C++ 中降低此解决方案的时间复杂度?
【发布时间】:2020-12-11 19:19:39
【问题描述】:

给定一个整数数组 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,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 个测试用例上出现了时间限制延长问题。如何优化?

【问题讨论】:

  • 这看起来像是来自某个竞赛/挑战/竞争性编码/黑客网站。是吗?如果您的目标是学习 C++,那么您将不会在那里学到任何东西。在几乎所有情况下,就像这个一样,正确的解决方案是基于数学或编程技巧。如果您不知道诀窍是什么并尝试编写蛮力方法,则程序运行缓慢并因此而失败。如果你想学习 C++,你不会从毫无意义的在线竞赛网站 but only from a good C++ textbook 学到任何东西。
  • 您通过使用不同的算法来“优化”。 (这看起来像一个动态规划问题,所以我将从那里开始。)
  • 是的,我认为这是一个 dp 问题,只是在寻找一种方法我可以在不使用 DP 的情况下在给定时间内解决它

标签: c++ algorithm vector data-structures dsa


【解决方案1】:

这可以使用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;
    }
};

【讨论】:

    【解决方案2】:

    这仅在一个循环中实现,来自one the first googled results。 通过一点点记账,您还可以使用 sum 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; 
       } 
    

    【讨论】:

      【解决方案3】:

      看看这个链接:https://www.geeksforgeeks.org/largest-sum-contiguous-subarray/

      那里有几个有效的解决方案。

      主要思想是保留一个 maxSum 变量,它将跟踪迄今为止看到的最大总和。您还需要一个 currentSum 变量来跟踪当前窗口中的总和。每次向当前总和添加一个正数时,将其与 maxSum 进行比较,如果 currentSum > maxSum 则更新 maxSum。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-13
        • 2012-07-28
        • 1970-01-01
        • 2011-06-15
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        相关资源
        最近更新 更多