0
点赞
收藏
分享

微信扫一扫

动态规划算法leetcode.152

public int maxProduct(int[] nums) {
        int len = nums.length;
        if (len == 0) {
            return 0;
        }
        int[][] dp = new int[len][2];//dp[i][0]表示以第i个数结尾的某个连续子数组乘积最小值,另一列为最大值
        //初始化
        dp[0][0] = nums[0];
        dp[0][1] = nums[0];
        for (int i = 1; i < len; i++) {
            //第i个数大于0时,应该用前i-1的最大值相乘得到dp[i][1],最小值相乘得到dp[i][0]
            if (nums[i] >= 0)
            {
                dp[i][1] = Math.max(nums[i], dp[i - 1][1] * nums[i]);
                dp[i][0]= Math.min(nums[i], dp[i - 1][0] * nums[i]);
            }
            else//第i个数小于0时,应该用前i-1的最小值相乘得到dp[i][1],最大值相乘得到dp[i][0]
            {
                dp[i][1] = Math.max(nums[i], dp[i - 1][0] * nums[i]);
                dp[i][0] = Math.min(nums[i], dp[i - 1][1] * nums[i]);
            }
        }

        int ans = Integer.MIN_VALUE;
        //寻找以某个数结尾的连续子数组的最大乘积
        for (int i = 0; i < len; i++) {
            ans = Math.max(ans, dp[i][1]);
        }
        return ans;
    }
举报

相关推荐

0 条评论