LeetCode 152. Maximum Product Subarray

Description:

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product.

Example 1:

Input: [2,3,-2,4]
Output: 6
Explanation: [2,3] has the largest product 6.
Example 2:

Input: [-2,0,-1]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

Solution:

其实最近一直在学习+刷题,只不过懒得跟新博客,有些题目比较琐屑,AC了就完事。

但是今天这个题目挺有意思的,这种解题模式不好理解,我也是之前dq的题目做了一些才比较快理解。

这种题目的核心思路是如何拆解。此类题目的数据可以中断(比如碰到0,前后就隔断了),所以思路就是碰到第 i 个Number的时候,有三种行为:只用它本身(这就能实现数据隔断);它乘以前一位的最大值;它乘以前一位的最小值(负负得正,可能比乘以最大值还大)。

之所以要乘以负数,是因为它现在虽然很小,但是当碰到下一个负数的时候,可能就翻身变成最大了。

这种题目模式和一些dp的模式在于如何确认第 i 个元素的行为模式。这很很很很抽象,需要用脑子debug和多做题来找感觉~

用信条的一句话:不要试着理解他,去感受他


public int maxProduct(int[] nums) {
        if (nums.length == 0 || nums == null)
            return -1;
        int final_result = nums[0], cur_max = nums[0], cur_min = nums[0];
        
        for (int i = 1; i < nums.length; ++i) {
            int temp = cur_max;
            temp = Math.max(nums[i], Math.max(nums[i] * cur_max, nums[i] * cur_min));
            cur_min = Math.min(nums[i], Math.min(nums[i] * cur_max, nums[i] * cur_min));
            cur_max = temp;
            
            if (cur_max > final_result) {
                final_result = cur_max;
            }
        }

        return final_result;
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值