每日一道 LeetCode 12 最大子序和

2022-03-17 18:26:30 字數 1186 閱讀 7659

每天 3 分鐘,走上演算法的逆襲之路。

每日一道 leetcode 前文合集

github:

gitee:

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

示例:

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

輸出: 6

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

高階:

如果你已經實現複雜度為 o(n) 的解法,嘗試使用更為精妙的分治法求解。

這道題有點意思,一開始我看著不難,但是嘗試了幾次解題,發現總有**不對。

直接開啟答案,看到解析,才知道這道題涉及到乙個叫做動態規劃的東西。

動態規劃(dynamic programming)是運籌學的乙個分支,是求解決策過程(decision process)最優化的數學方法。

動態規劃實際上是一類題目的總稱,並不是指某個固定的演算法。動態規劃的意義就是通過採用遞推(或者分而治之)的策略,通過解決大問題的子問題從而解決整體的做法。動態規劃的核心思想是巧妙的將問題拆分成多個子問題,通過計算子問題而得到整體問題的解。而子問題又可以拆分成更多的子問題,從而用類似遞推迭代的方法解決要求的問題。

這道題的題目是要求我們去求乙個數列中最大連續子串行的和。

稍稍轉變一下目標,我們把上面這個定義轉變一下,轉變成:

fk 是第 k 項前的最大序列和,求 f1 ~ fn 中最大值。

問題轉化到這一步,接著往下想,對於前 k 個項的最大子串行和,其實是在求前 k-1 項的最大子串行和與第 k 項的和,或者是與第 k 項相比兩者中較大的。

如果沒有理解的同學,可以參考下面的**,我也是看了這段**才明白了這個含義。

先上**,**其實很簡潔:

public int maxsubarray(int nums) 

return maxans;

}

這段**本身並不好理解,需要自己手動多 debug 幾次。

Leetcode 每日一道

如果不出意外每天會寫一道演算法題的部落格。如果題目簡單,就一天發布一道。如果題目比較難。我會2 3天發一道演算法的題目。今天寫的這道題目比較簡單。題目如下 解法我是用c 寫的。我的解法的大致想法是 先把需要轉換的矩陣直接轉換成一維的陣列,然後再根據要求把一維中的元素全部截為以c個元素為一組的vect...

每日一道leetcode 最大括號深度

有效括號字串 定義 對於每個左括號,都能找到與之對應的右括號,反之亦然。詳情參見題末 有效括號字串 部分。巢狀深度 depth 定義 即有效括號字串巢狀的層數,depth a 表示有效括號字串 a 的巢狀深度。詳情參見題末 巢狀深度 部分。有效括號字串型別與對應的巢狀深度計算方法如下圖所示 給你乙個...

每日一道 LeetCode 11 外觀數列

每天 3 分鐘,走上演算法的逆襲之路。每日一道 leetcode 前文合集 github gitee 給定乙個正整數 n 1 n 30 輸出外觀數列的第 n 項。注意 整數序列中的每一項將表示為乙個字串。外觀數列 是乙個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。前五項如下 1.1...