> 文档中心 > 【从0到1冲刺蓝桥杯国赛】每日一练——乘积最大子数组

【从0到1冲刺蓝桥杯国赛】每日一练——乘积最大子数组

成绩最大子数组icon-default.png?t=M276https://leetcode-cn.com/problems/maximum-product-subarray/

题目描述: 

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 

 

思路分析: 

求最大子数组,子数组中可以有负数,有两个负数就可以,而且负数越大,再出现负数的时候乘积就越大。 

 

 C++实现:

class Solution {public:    int maxProduct(vector& nums) { vector maxF(nums), minF(nums); for(int i = 1; i<nums.size(); i++){     maxF[i] = max(maxF[i - 1] * nums[i], max(nums[i], minF[i - 1] * nums[i]));     minF[i] = min(minF[i - 1] * nums[i], min(nums[i], maxF[i - 1] * nums[i])); } return *max_element(maxF.begin(), maxF.end());    }};

滚动数组: 

class Solution {public:    int maxProduct(vector& nums) { int maxF = nums[0], minF = nums[0], ans = nums[0]; for (int i = 1; i < nums.size(); ++i) {     int mx = maxF, mn = minF;     maxF = max(mx * nums[i], max(nums[i], mn * nums[i]));     minF = min(mn * nums[i], min(nums[i], mx * nums[i]));     ans = max(maxF, ans); } return ans;    }};