152 乘積最大子串行

2022-09-20 06:15:09 字數 1251 閱讀 8136

思路:

初版思路是將序列按照0拆開成若干子串行,然後在每個子串行裡面判斷負數的個數,若負數是偶數,直接相乘,若負數是奇數,要麼從左往右相乘直到最後乙個奇數,要麼從右向左相乘知道第乙個奇數

修改版的思路是從左往右遍歷+從右往左遍歷,使用dp[i]儲存相應方向直接相乘到i的數值。碰到0就跳過重新開始計算。

最終版的思路是使用動態規劃,記錄以i點結束的最大值跟最小值,然後求max(dp_max * nums[i], dp_min * nums[i]) 與 num[i] 兩者之間的最大值。常規dp。

初版:runtime error

class

solution

if(nums[i] < 0

) odd_num++;

}if(len == 1

)

if(odd_num % 2 == 0

)

return

max_num;

}else

}signal = true

;

for(int i = nums.size()-1; i >= 0; i--)

}return

max(max1, max2);}}

};

修改版:

執行用時 :8 ms, 在所有 c++ 提交中擊敗了77.55%的使用者

記憶體消耗 :9.1 mb, 在所有 c++ 提交中擊敗了44.38%的使用者

class

solution

int max_l = dp_l[0

];

int max_r = dp_r[0

];

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

for(auto i : dp_l)

for(int i = len-2; i >= 0; i--)

for(auto i : dp_r)

return

max(max_l, max_r);

}};

最終版:

執行用時 :4 ms, 在所有 c++ 提交中擊敗了95.67%的使用者

記憶體消耗 :8.9 mb, 在所有 c++ 提交中擊敗了87.90%的使用者

class

solution

return

maxval;

}};

152 乘積最大子串行

給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。記錄每一處為止的列表乘積最大最小值,後一處乘積的...

152 乘積最大子串行

給定乙個整數陣列 nums 找出乙個序列中乘積最大的連續子串行 該序列至少包含乙個數 示例 1 輸入 2,3,2,4 輸出 6 解釋 子陣列 2,3 有最大乘積 6。示例 2 輸入 2,0,1 輸出 0 解釋 結果不能為 2,因為 2,1 不是子陣列。如果要求不連續,把所有大於 0 的數字拿出來乘積...

152 乘積最大子串行

因為有負數和0的存在,使問題變得複雜了不少。用dp來做,而且要用兩個dp陣列,其中 1 f i 表示子陣列 0,i 範圍內並且一定包含nums i 數字的最大子陣列乘積,2 g i 表示子陣列 0,i 範圍內並且一定包含nums i 數字的最小子陣列乘積,3 初始化時f 0 和g 0 都初始化為nu...