簡體   English   中英

如何在 C++ 中降低此解決方案的時間復雜度?

[英]How do I reduce Time Complexity of this solution in C++?

給定一個 integer 數組 nums,找到總和最大的連續子數組(至少包含一個數)並返回其總和。

例子:

輸入:[-2,1,-3,4,-1,2,1,-5,4], Output: 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 個測試用例,但是在 rest 2 個測試用例上出現了時間限制延長問題。我該如何優化呢?

這可以使用Kadane 的算法來完成。

#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;
    }
};

下面這僅在一個循環中實現,從 第一個谷歌搜索結果開始 通過一點簿記,您還可以使用 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; 
   } 

看看這個鏈接: https://www.geeksforgeeks.org/largest-sum-contiguous-subarray/

那里有幾個有效的解決方案。

主要思想是保留一個 maxSum 變量,它將跟蹤迄今為止看到的最大總和。 您還需要一個 currentSum 變量來跟蹤當前 window 中的總和。 每次向當前總和添加一個正數時,將其與 maxSum 進行比較,如果 currentSum > maxSum 則更新 maxSum。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM