2022-4-6 高频面试题
给你一个整数数组 nums
,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
1 class Solution { 2 public int maxProduct(int[] nums) { 3 //动态规划 4 // f[i][0] 以i结尾的最大值 f[i][1] 最小值 5 // 最大值 nums[i] 6 // num - + - + + - - 7 // 最大值 8 int n=nums.length; 9 int[][] dp=new int[n][2]; 10 dp[0][0]=nums[0]; 11 dp[0][1]=nums[0]; 12 int ans=dp[0][0]; 13 for (int i=1;i<n;i++) { 14 if (nums[i]>=0) { 15 dp[i][0]=Math.max(dp[i-1][0]*nums[i],nums[i]); 16 dp[i][1]=Math.min(dp[i-1][1]*nums[i],nums[i]); 17 }else { 18 dp[i][1]=Math.min(nums[i]*dp[i-1][0],nums[i]); 19 dp[i][0]=Math.max(nums[i]*dp[i-1][1],nums[i]); 20 } 21 //System.out.println(dp[i][0]+" "+dp[i][1]); 22 ans=Math.max(ans,dp[i][0]); 23 } 24 return ans; 25 } 26 }
思路:动态规划,记录到当前下标位置的最大值和最小值。