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 ...