swift演算法 最大子序和

2021-09-24 14:43:56 字數 2047 閱讀 1096

1、描述

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

例1:輸入:[-2, 3, -1, 1, -3]

輸出:3

解釋:連續子陣列 [3, -1, 1] 的和最大,為3

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

輸出:6

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

2、演算法

解法一:暴力迴圈解法

思路:遍歷一遍,用兩個變數,乙個記錄最大的和,乙個記錄當前的和,最後找出連續子陣列最大的和

時間複雜度:o(n^2)

func maxsubarray(_ nums: [int]) -> int }}

return maxvalue

}

解法二:動態規劃

思路:1)動態規劃的是首先對陣列進行遍歷,當前最大連續子串行和為 sum,結果為 ans

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

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

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

圖示:

時間複雜度:o(n)

func maxsubarray(_ nums: [int]) -> int else

ans = max(ans, sum)

}return ans

}

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

解法一:非遞迴分治

思路:1)定義乙個max記錄過程中最大值

2)定義lsum、rsum從兩頭向中間推進的記錄的兩個最終子序和

3)到中間匯聚,再取最大值:math.max(max, lsum+rsum);

func maxsubarray(_ nums: [int]) -> int 

i += 1

j -= 1

}//匯聚

//maxvalue 左右兩邊最大的,lsum+rsum 中間聚合

return max(maxvalue, lsum+rsum)

}

解法二:遞迴分治

思想:通過遞迴分治不斷的縮小規模,問題結果就有三種,左邊的解,右邊的解,以及中間的解(有位置要求,從中介mid向兩邊延伸尋求最優解),得到三個解通過比較大小,等到最優解。

時間複雜度:o(nlogn)

func maxsubarray3(_ nums: [int]) -> int 

private func maxsubarraypart(_ nums : [int], _ left : int, _ right : int)->int

let mid = (left+right)/2

return max(maxsubarraypart(nums, left, mid), max(maxsubarraypart(nums, mid+1, right), maxsubarrayall(nums, left, mid, right)))

}//左右兩邊合起來求解

private func maxsubarrayall(_ nums : [int], _ left : int, _ mid : int, _ right : int)->int

i -= 1

}sum = 0

var rightsum = -2147483648

var j = mid+1

while j<=right

j += 1

}return leftsum+rightsum

}

演算法 最大子序和

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

演算法(2) 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。本題,意為在乙個陣列裡面找到乙個連續子陣列,並且這個子陣列是所有連續子陣列中和最大的。咱們就一...

python演算法 最大子序和

給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。辦法有很多,可是我卻偏偏想到最笨的乙個 這個辦法的主要思想就是,不斷地遍歷列表並累加,當大於res時,將res替換成該最大值,遍歷完一次後,把頭元素去掉,繼續遍歷 class solution def ...