題目描述:
解法一:動態規劃
設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是最大的,而且是連續的。提醒 子串子串行不同,子串要求連續,子串行不要求連續。分析 這個問題與...