演算法設計與分析(十四)

2021-09-01 11:35:53 字數 1467 閱讀 3206

given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

example 1:

input: [2,3,-2,4]

output: 6

explanation: [2,3] has the largest product 6.

example 2:

input: [-2,0,-1]

output: 0

explanation: the result cannot be 2, because [-2,-1] is not a subarray.

這道題目非常熟悉,在解決這道題目之前,我們先來看看這樣一道關於動態規劃的題目

這裡需要求相鄰的子串行的最大值,我們用s[j]表示以j結束的最大子段和,則在某個數比到目前為止的最大子段和要大的時候就會發生狀態的變化。

狀態轉移方程為:

s[j] = max(s[j-1] + a[j], a[j]);

最後求max(s)即可。

然後我們看會這道題,同樣是要求連續的子段,但不同點是前面的是通過加法累積,而這題是通過乘法累積,這樣會存在這樣乙個問題,那就是兩個負數相乘得到的結果是正數,也就是說到某個下標前的數是負數的,到當前為止並不是最大的,但當下乙個數是負數的時候,兩者相乘得到的結果就變得很大了,所以我們的演算法必須做出改變。

我們依然採取用乙個陣列存當前下標為止的最大子段和,為了適配負數的情況,我們多消耗空間來存當前下標為止的最小子段和,目的是當下乙個數是負數的情況相乘以後會變成很大的數,

當前最大子段乘積的狀態轉移方程:

max_cur[i] = max(nums[i-1], max((max_cur[i-1]*nums[i-1]), min_cur[i-1]*nums[i-1]));
當前最小子段乘積的狀態轉移方程:

min_cur[i] = min(nums[i-1], min(max_cur[i-1]*nums[i-1], min_cur[i-1]*nums[i-1]));
最後求最大子段乘積中的最大值即可。

class solution 

if(size == 1)

for(int i = 2; i <= size; i++)

for(int i = 1; i <= size; i++)

}return max1;}};

時間複雜度:這裡需要對陣列遍歷一次,所以這裡的時間複雜度是o(n)

空間複雜度:這裡我們用兩個陣列大小的數字來存最大子段乘積和最小子段乘積,所以空間複雜度是o(n)

演算法設計與分析

輸入輸出 確定性有窮性 np類問題是非確定性計算模型下的易驗證問題類。所有可以在多項式時間內求解的判定問題構成p類問題 1 二分搜尋技術 二分搜尋演算法的基本思路是對給定已排好序的n個元素a 0 n 1 在這n個元素中找出乙個特定元素x。運用分治的思想,將n個元素以n 2為中心對半分。if x a ...

演算法分析與設計

分析,此題可以用動態規劃來做。子問題為 max i max i 1 0 max i 1 nums i nums i max i 表示以nums i 結尾的子串的最大和,最後返回最大的那個即為所求,複雜度為o n class solution return max 另一種實現方法,更加簡潔,即從前往後...

演算法設計與分析

ylbtech miscellaneos 演算法設計與分析 a,返回頂部1,演算法設計與分析 是2009年國防工業出版社出版的圖書,作者是張德富。書主要取材於演算法設計與分析領域的經典內容,並介紹了演算法設計的發展趨勢。內容主要包括非常經典的演算法設計技術,例如遞迴與分治 動態規劃 貪心 回溯 分支...