152. Maximum Product Subarray

来源:互联网 发布:关于linux 的书籍 编辑:程序博客网 时间:2024/06/10 00:39

LeetCode

  • 地址:https://leetcode.com/problems/maximum-product-subarray/#/description
  • 问题描述:求的是一个连续的子序列,使得乘积最大,注意因为都是整数,所以除了×0之外,都会让数的绝对值变大或者起码不变。那么可以理解成,0是分割点,如果都是正的,那么只需要对两个0+起始点和结束点划分的连续子序列不断求积即可,只要比记录的最大值大就好了。如果有负数的话就比较麻烦,比如-2,3,4,-5,-6这样,顺着乘就会发现,最大的是-2到-5,120,而其实是3到-6,360.所以问题在于顺着乘可能会出现这种情况,所以需要反着乘,同时比较两者哪个大。其实上述问题简单来说就是,如果最大序列被夹在3个负数中间假设是A,B,C,那么就需要判断A的绝对值大还是C的大,中间的B是没有影响的,所以用两种顺序一定能找到最大值。代码如下:
  • 代码:
class Solution {public:    int max(int a, int b) {return a > b ? a : b;}     int maxProduct(vector<int>& nums) {        int frontProduct = 1;        int backProduct = 1;        int ans = INT_MIN;        int n = nums.size();        for (int i = 0; i < n; ++i) {            frontProduct *= nums[i];            backProduct *= nums[n - i - 1];            ans = max(ans,max(frontProduct,backProduct));            frontProduct = frontProduct == 0 ? 1 : frontProduct;            backProduct = backProduct == 0 ? 1 : backProduct;        }        return ans;    }};
原创粉丝点击