Leetcode53最大子序和

2021-09-19 05:58:19 字數 1108 閱讀 9731

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

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

輸出: 6

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

自己的思路過程:我第一次思考的時候對狀態的定義是f(i)代表到i為止最大的連續子陣列和的值。這是正確的

但是對狀態的轉移產生了問題,因為我對題目找到乙個具有最大和的連續子陣列的數學表達形式出現了問題,我理解成了f(i)=math.max(f(n-1)+vi,f(n-1))這是錯誤的,而且我也沒在後面反思到這一點,因為假設從-2,1,3開始當選擇3開始的時候,就要比較f(3-1)+v3,f(3-1)。這個時候我應該再回到題幹,舉例子看是否我的轉移方程滿足了題幹,滿足了題幹要求才算是對的。

實際正確的轉移方程是f(i)=math.max(f(n-1)+vi,vi),意思是當前之前的最大值加上當前值小於vi,證明之前的不算,從當前開始。倘若從f(n-1)+vi>vi,那麼證明前面的可能存在最大值。

同時,邊界條件的確定應該來自於,轉移方程,f(n)=f(n-1)+vi,那麼n-1>=0,所以邊界的起點就應該是,res[0]=nums[0],而且迭代應該從1開始就好了。

同時還應該考慮到res,裡面的值分布不均勻,必須進行一次排列。arrays.sort(res);最後乙個是最大值。

**:

public int maxsubarrays(int nums) 

if(nums.length==1)

if(nums.length==2)

int to = nums.length;

int res = new int[to];

res[0] = nums[0];

for(int i=1;i第二種方法速度更快。

思路就是,用1乙個變數儲存每次迭代下來的值,再乙個變數每次比較當前的最大值不斷更新

其實這個就是用乙個空間複雜度為1的變數來處理,而不是用新開闢乙個的陣列來處理。

**:public int maxsubarray(int nums)

}return sum;

}

LeetCode53最大子序和

給定乙個序列 至少含有 1 個數 從該序列中尋找乙個連續的子串行,使得子串行的和最大。例如,給定序列 2,1,3,4,1,2,1,5,4 連續子串行 4,1,2,1 的和最大,為6。擴充套件練習 若你已實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。一開始用的最簡單最直接的方法,挨個的把...

LeetCode 53 最大子序和

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

LeetCode 53 最大子序和

題目鏈結 題目描述 給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。解決方法 解題思路 動態規劃,複雜度為 o n 令dp i 表示最後一項為...