解题思路:
动态规划
使用滚动数组,减少数组的开辟的空间
dp[i][0]: 数组下表从0到i 使用nums[i]的乘积最大的值
dp[i][1]: 数组下表从0到i 使用nums[i]的乘积最小的值
为什么使用最大值和最小值?
答: 因为当前元素可能为正也可能为负,如果为正,使用最大值,如果为负,使用最小值。
int x=i%2;
int y=(i-1)%2;
arr[x][0]=Math.max(Math.max(arr[y][0]*nums[i],arr[y][1]*nums[i]),nums[i]);
arr[x][1]=Math.min(Math.min(arr[y][0]*nums[i],arr[y][1]*nums[i]),nums[i]);
代码:
public static void main(String[] args) {
int[] nums={2,3,-2,4};
int ans = maxProduct2(nums);
System.out.println(ans);
}
public static int maxProduct(int[] nums) {
int[][] arr=new int[nums.length][2];
arr[0][0]=nums[0];
arr[0][1]=nums[0];
int res=nums[0];
for(int i=1;i<nums.length;i++){
arr[i][0]=Math.max(Math.max(arr[i-1][0]*nums[i],arr[i-1][1]*nums[i]),nums[i]);
arr[i][1]=Math.min(Math.min(arr[i-1][0]*nums[i],arr[i-1][1]*nums[i]),nums[i]);
res=Math.max(res,arr[i][0]);
}
return res;
}
public static int maxProduct2(int[] nums) {
int[][] arr=new int[2][2];
arr[0][0]=nums[0];
arr[0][1]=nums[0];
int res=nums[0];
for(int i=1;i<nums.length;i++){
int x=i%2;
int y=(i-1)%2;
arr[x][0]=Math.max(Math.max(arr[y][0]*nums[i],arr[y][1]*nums[i]),nums[i]);
arr[x][1]=Math.min(Math.min(arr[y][0]*nums[i],arr[y][1]*nums[i]),nums[i]);
res=Math.max(res,arr[x][0]);
}
return res;
}
来源:CSDN
作者:houjibofa2050
链接:https://blog.csdn.net/u011243684/article/details/104165371