题意:

image.png

解题思路:

  1. 思路:
  2. 1. 依次遍历数组计算当前最大值,不断更新当前最大值;
  3. 2. 求出每一步的最大,imax = max(imax * nums[i], nums[i]);
  4. 3. 由于存在负数,如果一个正整数乘以一个负数,那会导致这个正整数变成一个负数,因此需要维护一个最小值,imin = min(imin * nums[i], nums[i])
  5. 4. 当负数出现时,则用imaximin交换再进行计算

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @return Integer
  5. */
  6. function maxProduct($nums) {
  7. $max = PHP_INT_MIN;
  8. $imin = $imax = 1;
  9. foreach ($nums as $num) {
  10. if ($num < 0) {
  11. $temp = $imin;
  12. $imin = $imax;
  13. $imax = $temp;
  14. }
  15. $imin = min($num, $imin * $num);
  16. $imax = max($num, $imax * $num);
  17. $max = max($max, $imax);
  18. }
  19. return $max;
  20. }
  21. function maxProductDp($nums) {
  22. $dpMax[0] = $dpMin[0] = $nums[0];
  23. $max = $nums[0];
  24. for ($i = 1; $i < count($nums); $i++) {
  25. $dpMax[$i] = max($nums[$i], $dpMax[$i - 1] * $nums[$i], $dpMin[$i - 1] * $nums[$i]);
  26. $dpMin[$i] = min($nums[$i], $dpMax[$i - 1] * $nums[$i], $dpMin[$i - 1] * $nums[$i]);
  27. $max = max($max, $dpMax[$i]);
  28. }
  29. return $max;
  30. }
  31. }

GO代码实现:

  1. func maxProduct(nums []int) int {
  2. imax, imin, ans := nums[0], nums[0], nums[0]
  3. for i := 1; i < len(nums); i++ {
  4. mx, mn := imax, imin
  5. imax = max(mx * nums[i], max(nums[i], mn * nums[i]))
  6. imin = min(mn * nums[i], min(nums[i], mx * nums[i]))
  7. ans = max(imax, ans)
  8. }
  9. return ans
  10. }
  11. func max(x, y int) int {
  12. if x > y {
  13. return x
  14. }
  15. return y
  16. }
  17. func min(x, y int) int {
  18. if x < y {
  19. return x
  20. }
  21. return y
  22. }