题意:
解题思路:
思路:
1. 依次遍历数组计算当前最大值,不断更新当前最大值;
2. 求出每一步的最大,imax = max(imax * nums[i], nums[i]);
3. 由于存在负数,如果一个正整数乘以一个负数,那会导致这个正整数变成一个负数,因此需要维护一个最小值,imin = min(imin * nums[i], nums[i])
4. 当负数出现时,则用imax与imin交换再进行计算
PHP代码实现:
class Solution {
/**
* @param Integer[] $nums
* @return Integer
*/
function maxProduct($nums) {
$max = PHP_INT_MIN;
$imin = $imax = 1;
foreach ($nums as $num) {
if ($num < 0) {
$temp = $imin;
$imin = $imax;
$imax = $temp;
}
$imin = min($num, $imin * $num);
$imax = max($num, $imax * $num);
$max = max($max, $imax);
}
return $max;
}
function maxProductDp($nums) {
$dpMax[0] = $dpMin[0] = $nums[0];
$max = $nums[0];
for ($i = 1; $i < count($nums); $i++) {
$dpMax[$i] = max($nums[$i], $dpMax[$i - 1] * $nums[$i], $dpMin[$i - 1] * $nums[$i]);
$dpMin[$i] = min($nums[$i], $dpMax[$i - 1] * $nums[$i], $dpMin[$i - 1] * $nums[$i]);
$max = max($max, $dpMax[$i]);
}
return $max;
}
}
GO代码实现:
func maxProduct(nums []int) int {
imax, imin, ans := nums[0], nums[0], nums[0]
for i := 1; i < len(nums); i++ {
mx, mn := imax, imin
imax = max(mx * nums[i], max(nums[i], mn * nums[i]))
imin = min(mn * nums[i], min(nums[i], mx * nums[i]))
ans = max(imax, ans)
}
return ans
}
func max(x, y int) int {
if x > y {
return x
}
return y
}
func min(x, y int) int {
if x < y {
return x
}
return y
}