最大子序和的golang實現

2022-07-25 07:00:09 字數 1596 閱讀 2719

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

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

],輸出:

6解釋: 連續子陣列 [

4,-1,2,1] 的和最大,為 6。

首先理解題意:

核心**:

//

取出第一位為基準值

sum := nums[0

] res :=sum

//下標從1開始

for i := 1; i < len(nums); i++

else

res =max(res, sum)

}

整體**:

package main

import (

"fmt")

func maxsubarray(nums

int) int

else

res =max(res, sum)

}return

res}

func max(a, b

int) int

returnb}

func main()

//nums := int

fmt.println(maxsubarray(nums))

}

經查詢上方的演算法叫掃瞄法,時間複雜度為o(n)。

下面我們嘗試一下使用動態規劃法來解題:

解題思路:

設sum[i]為以第i個元素結尾且和最大的連續子陣列。假設對於元素i,所有以它前面的元素結尾的子陣列的長度都已經求得,那麼以第i個元素結尾且和最大的連續子陣列實際上,要麼是以第i-1個元素結尾且和最大的連續子陣列加上這個元素,要麼是只包含第i個元素,即sum[i] = max(sum[i-1] + a[i], a[i])。可以通過判斷sum[i-1] + a[i]是否大於a[i]來做選擇,而這實際上等價於判斷sum[i-1]是否大於0。由於每次運算只需要前一次的結果,因此並不需要像普通的動態規劃那樣保留之前所有的計算結果,只需要保留上一次的即可,因此演算法的時間和空間複雜度都很小

完整**:

//

動態規劃解法

//假設sum[i]為以第i個元素結尾且和最大的連續子陣列。

//假設對於元素i,所有以它前面的元素結尾的子陣列的長度都已經求得

//那麼以第i個元素結尾且和最大的連續子陣列實際上,要麼是以第i-1個元素結尾且和最大的連續子陣列加上這個元素,要麼是只包含第i個元素

//即sum[i] = max(sum[j:i-1] + a[i], a[i])。

//j是陣列的某個下標,0<=j//

可以通過判斷sum[i-1] + a[i]是否大於a[i]來做選擇,而這實際上等價於判斷sum[i-1]是否大於0。

//由於每次運算只需要前一次的結果,因此並不需要像普通的動態規劃那樣保留之前所有的計算結果,只需要保留上一次的即可,因此演算法的時間和空間複雜度都很小

func maxsubarraykmp(nums int) int

else

if (sum }

return

res}

最大子序和

演算法一 對這個問題,有乙個相對複雜的 o nlogn 的解法,就是使用遞迴。如果要是求出序列的位置的話,這將是最好的演算法了 因為我們後面還會有個 o n 的演算法,但是不能求出最大子串行的位置 該方法我們採用 分治策略 divide and conquer 在我們例子中,最大子串行可能在三個地方...

最大子序和

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。方法一 雙指標窮舉法 思路 要找到最大和的連續陣列,那麼就將所有可能的和都拿到,取到最大的即...

最大子序和

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