问题:
找出一个序列中乘积最大的连续子序列(至少包含一个数)。
解题思路:
该题是典型的动态规划问题,考虑到序列中存在负数的情况,需要定义两个辅助数组,一个存储以当前元素结尾的最大乘积,一个记录以当前元素结尾的最小乘积。
int maxProduct(vector<int>& nums) {
// write your code here
int size = nums.size();
if(size < 1)
return 0;
//创建辅助数组,记录以当前元素结尾的最大乘积
int *curmax = new int[size];
int *curmin = new int[size];
memset(curmax, 0, sizeof(int) * size);
memset(curmin, 0, sizeof(int) * size);
//填充辅助数组
int maxnum = nums[0];
curmax[0] = nums[0];
curmin[0] = nums[0];
for(int i = 1; i < size; i++){
curmax[i] = max(nums[i], max(nums[i] * curmax[i - 1], nums[i] * curmin[i - 1]));
curmin[i] = min(nums[i], min(nums[i] * curmin[i - 1], nums[i] * curmax[i - 1]));
if(curmax[i] > maxnum){
maxnum = curmax[i];
}
}
return maxnum;
}