题目描述

image.png

解题思路

本题主要难就难在有负数,所以求得时候不能只考虑最大的,如果为负数我们就要将本身来乘前面最小的,如果为正数,就需要乘前面最大的。
所以分两个状态来求。
image.png
写法一:

  1. public int maxProduct(int[] nums) {
  2. int[] maxDp = new int[nums.length];
  3. int[] minDp = new int[nums.length];
  4. maxDp[0] = nums[0];
  5. minDp[0] = nums[0];
  6. int max = nums[0];
  7. for (int i = 1; i < nums.length; i++) {
  8. maxDp[i] = Math.max(maxDp[i - 1] * nums[i], Math.max(nums[i], minDp[i - 1] * nums[i]));
  9. minDp[i] = Math.min(minDp[i - 1] * nums[i], Math.min(nums[i], maxDp[i - 1] * nums[i]));
  10. max = Math.max(max, maxDp[i]);
  11. }
  12. return max;
  13. }

写法二:

  1. public int maxProduct(int[] nums) {
  2. int[][] dp = new int[nums.length][2];
  3. dp[0][0] = nums[0];
  4. dp[0][1] = nums[0];
  5. int max = nums[0];
  6. for (int i = 1; i < nums.length; i++) {
  7. dp[i][0] = Math.max(dp[i - 1][0] * nums[i], Math.max(nums[i], dp[i - 1][1] * nums[i]));
  8. dp[i][1] = Math.min(dp[i - 1][1] * nums[i], Math.min(nums[i], dp[i - 1][0] * nums[i]));
  9. max = Math.max(max, dp[i][0]);
  10. }
  11. return max;
  12. }

滚动数组优化:

  1. // 滚动数组优化
  2. public int maxProduct(int[] nums) {
  3. int minF = nums[0], maxF = nums[0], ans = nums[0];
  4. for (int i = 1; i < nums.length; i++) {
  5. int mx = maxF, mn = minF;
  6. maxF = Math.max(mx * nums[i], Math.max(nums[i], mn * nums[i]));
  7. minF = Math.min(mn * nums[i], Math.min(nums[i], mx * nums[i]));
  8. ans = Math.max(ans, maxF);
  9. }
  10. return ans;
  11. }