LeetCode 152. Maximum Product Subarray

来源:互联网 发布:zepto.js左右滑动事件 编辑:程序博客网 时间:2024/06/18 13:07

必须要考虑到的情况: 负数,零。 两种方法:


方法一: 保留最大值,最小值。当负数存在时,交换最大最小值。用了swap函数,很巧妙。


 

class Solution {
public:
    int maxProduct(vector<int>& nums) {


        
        int product = nums[0], val_max=r, val_min=r;
            
        for(int i=1; i<nums.size();i++)
        {
            if(nums[i] < 0) swap(val_max, val_min);
            
            val_max = max(nums[i], nums[i]*val_max);
            val_min = min(nums[i], nums[i]*val_min);
            r = max(r, val_max);
        }
        
        
        
        return r;

        
    }
};


方法二:相当于分别从数组 “头” 、“尾” 出发,依次遍历数组中的各元素,并取乘机最大值。


class Solution {
public:
    int maxProduct(vector<int>& nums) {


        int res=INT_MIN, front=1, back=1;


        for(int i=0; i<nums.size(); i++)
        {
            res = max(res, max(front*=nums[i], back*=nums[nums.size()-1-i]));


            if(front==0) front=1;
            if(back==0) back=1;


        }
        
        return res;
        
        
    }
};


小结: 灵活运用max函数,可省去很多麻烦;考虑程序在不同适用条件下的可行性。