連續子串的最大乘機

2021-10-06 04:18:38 字數 1425 閱讀 9153

題目描述:

解法一:動態規劃

設dpmax[i]為當前找到的最大值,dpmin[i]為當前找到的最小值

求dpmax的方法:

nums[i]>0 dpmax[i-1]>0 則dpmax[i]=dpmax[i-1]*nums[i]

nums[i]>0 dpmax[i-1]<0 則dpmax[i]=nums[i]

nums[i]<0 dpmin[i-1]<0 則dpmax[i]=dpmin[i-1]*nums[i]

nums[i]<0 dpmin[i-1]>0 則dpmax[i]=nums[i]

求dpmin方法:

nums[i]>0 dpmin[i-1]>0 則dpmin[i]=nums[i]

nums[i]>0 dpmin[i-1]<0 則dpmin[i]=nums[i]*dpmin[i-1]

nums[i]<0 dpmax[i-1]>0 則dpmin[i]=dpmax[i-1]*nums[i]

nums[i]<0 dpmax[i-1]<0 則dpmin[i]=nums[i]

我們注意到,在求dpmax時,只用到了dpmax[i-1]*nums[i],dpmin[i-1]*nums[i],nums[i]

同理,在求dpmin時,只用到了nums[i]*dpmin[i-1],dpmax[i-1]*nums[i],nums[i]

因此我們只需找出dpmax[i-1]*nums[i],dpmin[i-1]*nums[i],nums[i]三者的最大值和最小值作為dpmax[i]、dpmin[i]。

此外在編寫**的時候我們發現,我們只用到dpmax[i-1]、dpmin[i-1]、dpmin[i]、dpmin[i]的資訊,因此我們不需要用陣列來儲存,只需用dpmax和dpmin記錄即可。

**如下:

#include 

#include 

using namespace std;

class solution {

public:

int maxproduct(vector& nums) {

int len=nums.size();

int dp=nums[0];

int dn=nums[0];

int temp=nums[0];

for(int i=1;iint tempdn=dn;

int tempdp=dp;

dn=min(tempdp*nums[i],min(nums[i],tempdn*nums[i]));

dp=max(tempdp*nums[i],max(nums[i],tempdn*nums[i]));

//couttemp){

temp=dp;

return temp;

最大乘積連續子串

輸入一組浮點數,求出這個浮點陣列最大乘積的連續子串。舉個例子,浮點陣列為str 這時得出來的結果是前兩個浮點數的乘積,即15。需要注意的是,這個子串是要求連續的,另外,子串的長度可以為1.這裡給出兩種思路,後續可能還會加入新的思路。第一種是直接求解。即用雙層迴圈。外面一層是從1到浮點陣列的長度,裡面...

陣列連續子陣列最大和最大乘積

題目 給定乙個陣列,要求其連續子陣列的最大和。如陣列為,連續子陣列的最大和為8 從第0個開始,到第3個為止 解法1 首先最容易想到的便是利用列舉的方法,列舉出所有可能大小的連續子陣列的和,然後選出其中最大的乙個。即從連續子陣列的大小為1一直到n,分別計算它們的和,最後選出使和最大的那個子陣列。這種方...

23最大乘積子串

題目描述 給乙個浮點數序列,取最大乘積連續子串的值,例如 2.5,4,0,3,0.5,8,1,則取出的最大乘積連續子串為3,0.5,8。也就是說,上述陣列中,3 0.5 8這3個數的乘積3 0.5 8 12是最大的,而且是連續的。提醒 子串子串行不同,子串要求連續,子串行不要求連續。分析 這個問題與...