LeetCode_Maximum Subarray | Maximum Product Subarray

Maximum Subarray

一、题目描述

这里写图片描述


就是求一个数组的最大子序列

二、思路及代码

首先我们想到暴力破解

public class Solution {
    public int maxSubArray(int[] nums) {
       int sum = Integer.MIN_VALUE;
       for(int i=0; i<nums.length; i++)
           for(int j=i+1; j<nums.length; j++) 
               sum = Math.min(nums[i]+nums[j], sum);

       return sum;
    }
}

果然TLE了,于是要找到合适的时间复杂度。所以再寻找时间复杂度小于N平方的。

所以我们想到既然要求最大子序列,那么我们在扫面累加数组元素时,判断之前的元素是否小于0,如果小于0,说明不用累加了,因为会“拖累”后边求和的值。于是演变成了动态规划问题。递推公式就是 maxSum=Math.max(maxSum,curSumi) 。其中 curSumi 就是到第 i 个数字时最大的和值。

public class Solution {
    public int maxSubArray(int[] nums) {
       int sum = nums[0], maxSum = nums[0];
       for(int i=1; i<nums.length; i++) {
           if(sum < 0) sum = 0; //判断之前的sum是否可以利用
           sum += nums[i];
           maxSum = Math.max(sum, maxSum);
       }
       return maxSum;
    }
}

Maximum Product Subarray

一、题目描述

这里写图片描述

二、代码及思路

思路与上道题有所不同,这里要求是求乘积,那么乘积有个最简单的性质:负负得正;

那么如果套用上面那道题的思路,当前最小值如果是负值,如果下一个也是负值,就很可能成为一个很大的正值。所以我们这里需要两个保存当前最小值和最大值的局部变量。

public class Solution {
    public int maxProduct(int[] nums) {
        int localMaxProduct = nums[0], localMinProduct = nums[0], maxProduct = nums[0]; 

        for(int i=1; i<nums.length; i++) {
            int copy_localMinProduct = localMinProduct;
            localMinProduct = Math.min(Math.min(nums[i]*copy_localMinProduct, nums[i]*localMaxProduct), nums[i]);
            localMaxProduct = Math.max(Math.max(nums[i]*copy_localMinProduct, nums[i]*localMaxProduct), nums[i]);
            maxProduct = Math.max(localMaxProduct, maxProduct);
        }
        return maxProduct;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值