leetcode 152. 乘积最大子序列

☆樱花仙子☆ 提交于 2020-02-05 03:49:16

解题思路:

动态规划

使用滚动数组,减少数组的开辟的空间

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;
    }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!