每日刷題 最大子序和

2021-09-27 06:55:37 字數 1455 閱讀 9547

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

示例:

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

輸出: 6

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

針對該問題,現給出三種解法。

解法一:暴力求解(最直觀的方法)

對於長度為 n 的陣列a, 任選兩個位置作為區間起始和末尾,計算該區間所代表的的子陣列的和,選擇最大的乙個。

因為需要兩重迴圈,因此時間複雜度為o(n^2).

由於計算區間和時需要借助乙個輔助陣列,因此空間複雜度為o(n).

**:

int

find_max_subarray

( vector<

int>

& a)

解法二:分治演算法(不好理解且**長)

假設將陣列a[low, …, high] 以位置mid處劃分為兩個長度大致相等的子陣列,則最大子陣列a[i, …, j] 必定為以下三種情況之一:

最大子陣列完全位於 a[low, …, mid] 之間,即 low <= i <= j <= mid.

最大子陣列完全位於 a[mid, …, high] 之間,即 mid <= i <= j <= high.

最大子陣列跨越了 mid 位置,即 low <= i <= mid < j <= high.

**:

int

find_max_subarray

( vector<

int>

& a,

int left,

int right)

sum = sum_max;

// 向另外一側移動時需要初始化

for(

int i = mid +

1; i <= right; i++

)return

max(

max( l, r)

, sum_max);}

// 在主程式中輸入的引數應該為 find_max_subarray(a, 0, a.size() - 1)

解法三:動態規劃(不易理解但短小精悍)

初始化變數 sum = 0, 從頭遍歷陣列,對於每乙個元素 a[i], 變數 sum += a[i], 一旦 sum < 0, 立即讓 sum = 0, 並向後移動乙個元素,直到陣列尾部。最終選擇最大的 sum 值。

為直觀起見,以陣列 a = [-2, 3, -1, 2, -3] 為例:

每日一題 最大子序和

這道題雖然是簡單題,但我覺得很有趣,o n 的思路其實很簡單 從第乙個元素開始,如果當前元素超過從頭到當前所有元素之和,那麼就把當前元素作為第乙個元素繼續遍歷 class solution def maxsubarray self,nums list int int n len nums curr ...

每日一題 最大子序和

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

LeetCode刷題之路 最大子序和

leetcode說話題之路 最大子序和 題目 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。注 本題目是乙個非常經典的題目,可以用多種方法解決,暴...