最大連續子串行的和是一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列(不允許空序列),使它們的和盡可能大。
例:輸入序列 [2,3,-1,4] , 輸出 9
注意:可以假設 輸入的陣列不為空,同時輸入的值都是整數。
解法一:暴力破解 ,可以窮舉出所有的子串行,然後計算每個子串行的和,時間複雜度是o(n ^ 3),**如下:
private static int maxsum(int nums)
if (sum > maxsum)
maxsum = sum;
}} return maxsum;
}
解法二:可用用乙個陣列記錄從開始到某個位置的和,例如sum[i] 表示從位置0到位置i的和,就可以省略到演算法一中的第三層迴圈,演算法的時間複雜度是 o(n ^ 2)
private static int maxsum1(int nums)
int maxsum = nums[0];
for (int i = 0; i < nums.length; i++)
} return maxsum;
}
解法三 :分治法,見下圖,時間複雜度是o(n*logn)
**如下:
private static int maxproduct(int nums, int left, int right)
// 劃分為兩個規模更小的子問題
int mid = (left + right) >> 1;
int imaxleft = maxproduct(nums, left, mid);
int imaxright = maxproduct(nums, mid + 1, right);
// 橫跨分割點的情況
int sum = 0, lmax = nums[mid], rmax = nums[mid + 1];
for (int i = mid; i >= left; i--)
sum = 0;
for (int i = mid + 1; i <= right; i++)
// 答案是三種情況的最大值
int ans = lmax + rmax;
if (imaxleft > ans)
ans = imaxleft;
if (imaxright > ans)
ans = imaxright;
return ans;
}
解法四:動態規劃設定 dp[i] 表示以第i個數結尾的最大子串行的和,則 可以推導出以下公式
dp[n] = max(0, dp[n-1]) + nums[n]。則最大子串行的和是max(dp[m]) | m∈[0, n-1]
。
**如下:
private static int maxsum3(int nums)
return maxsum;
}
求最大子串行和演算法
這是個比較經典的c語言演算法問題。記得,在大二參加c語言比賽的時候,碰到過這個問題。當時就在網上學習了這麼乙個經典演算法。但是到了現在已經有點兒遺忘,今天無意之中又看到了這道題,感覺很親切,而且感覺到這個演算法真的非常經典,所以還是決定收藏在部落格中,希望自己能牢記這個問題。這個演算法用到了動態規劃...
經典演算法 求最大子列和
題目 最大連續子數列和一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列 不允許空序列 使它們的和盡可能大。我們一起用多種方式,逐步優化解決這個問題。為了更清晰的理解問題,首先我們先看一組資料 8 2 6 1 5 4 7 2 3 輸出 14 題解 ...
求最大子串行和
include using namespace std int maxseqsum const int a,int n o n 2 return s2 int maxseqsum2 const int a,int n o n else if s1 0 return s2 int maxseqsum3...