Leetcode No 53 最大子序和

2021-10-19 07:20:58 字數 1716 閱讀 3133

給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

示例 1:

輸入:nums = [-2,1,-3,4,-1,2,1,-5,4]

輸出:6

解釋:連續子陣列 [4,-1,2,1] 的和最大,為 6 。

示例 2:

輸入:nums = [1]

輸出:1

示例 3:

輸入:nums = [0]

輸出:0

示例 4:

輸入:nums = [-1]

輸出:-1

示例 5:

輸入:nums = [-100000]

輸出:-100000

假設 nums 陣列的長度是 n,下標從 0 到 n−1。

我們用 f(i)代表以第 i 個數結尾的「連續子陣列的最大和」,那麼很顯然我們要求的答案就是:

max 其中0≤i≤n−1

因此我們只需要求出每個位置的 f(i),然後返回 f 陣列中的最大值即可。那麼我們如何求 f(i)呢?我們可以考慮 nums[i] 單獨成為一段還是加入f(i−1) 對應的那一段,這取決於 nums[i] 和f(i−1)+nums[i] 的大小,我們希望獲得乙個比較大的,於是可以寫出這樣的動態規劃轉移方程:

f(i)=max

不難給出乙個時間複雜度 o(n)、空間複雜度 o(n)的實現,即用乙個 f 陣列來儲存 f(i) 的值,用乙個迴圈求出所有 f(i)。

class solution {

public int maxsubarray(int nums) {

//dp[i]=max(dp[i-1]+nums[i],nums[i])

int n=nums.length;

int dp=new int[n];

for(int i=0;i考慮到 f(i) 只和f(i−1) 相關,於是我們可以只用乙個變數 pre 來維護對於當前 f(i)的 f(i-1)的值是多少,從而讓空間複雜度降低到 o(1),這有點類似「滾動陣列」的思想。

class solution {

public int maxsubarray(int nums) {

int pre=0;

int maxsum=nums[0];

for(int i=0;i複雜度分析

時間複雜度:o(n),其中 n 為 nums 陣列的長度。我們只需要遍歷一遍陣列即可求得答案。

空間複雜度:o(1)。我們只需要常數空間存放若干變數。

如果 sum > 0,則說明 sum 對結果有增益效果,則 sum 保留並加上當前遍歷數字

如果 sum <= 0,則說明 sum 對結果無增益效果,需要捨棄,則 sum 直接更新為當前遍歷數字

每次比較 sum 和 ans的大小,將最大值置為ans,遍歷結束返回結果

class solution {

public int maxsubarray(int nums) {

int sum=0;

int max=nums[0];

for(int i=0;i複雜度分析

時間複雜度:o(n),其中 n 為 nums 陣列的長度。我們只需要遍歷一遍陣列即可求得答案。

空間複雜度:o(1)。我們只需要常數空間存放若干變數。

Leetcode No 53 最大子序和

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。補項追蹤法 貪心...

53 Maximum Subarray最大子串和

題目 find the contiguous subarray within an array containing at least one number which has the largest sum.for example,given the array 2,1,3,4,1,2,1,5,4...

53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。兩個變數,乙個是ans,用來儲存 更新子串行 乙個maxn,始終儲存著當前最大的子串行。子串行...