[英]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.