152. Maximum Product Subarray
来源:互联网 发布:java三天打鱼两天晒网 编辑:程序博客网 时间:2024/03/29 05:36
本题思路不难想,但是需要考虑周全
一个数组里面,数可能有正,负,0,三种
想要获取最大的连续子数组乘积,就需要考虑负数的位置了
当一个数组里没有0的时候,可以分成这样几部分
1.第一个负数(包括该负数)之前的
2.第一个负数之后的到最近的负数(包括该负数)之前的
3.最近的负数之后的数的乘积
例如
假设i=8
数组i=8之前的可以划分为以下三部分
[2,3,-1,2,4,-3,4,3, -5,2,3,4,5][2,3,-1][2,4,-3][4,3]
当负数个数为0时,最大值为总的乘积
当负数个数为一个的时候,最大值为 第三部分和上一步骤中的较大者
当一共遇到奇数个负数的时候,最大值为第二部分与第三部分的乘积,与前两步骤相比的最大值
当遇到偶数个负数的时候,最大值为总的乘积
当遇到0的时候,三部分都清零,重新开始比较,实际上该问题的解,就是由0分割的子数组,之中的解的最大值
class Solution {public: int maxProduct(vector<int>& nums) { if(nums.size()==1) return nums[0]; int max_num=nums[0]; int temp=1; int temp_=1; int temp__=1; int always_plus=1; for(int i=0;i<nums.size();i++) { if(nums[i]==0) { if(0>max_num) max_num=0; temp=1; temp_=1; temp__=1; always_plus=1; } else if(nums[i]<0) { if(temp_==1) { temp_=temp*nums[i]; if(temp_>max_num) max_num=temp_; } else { temp__=temp__*temp*nums[i]; if(temp__<0) { always_plus=temp__*temp_; if(always_plus>max_num) max_num=always_plus; } else { always_plus=temp__; if(always_plus>max_num) max_num=always_plus; } } temp=1; } else { temp*=nums[i]; if(always_plus*temp>max_num) max_num=always_plus*temp; } } return max_num; }};
0 0
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- 152. Maximum Product Subarray
- Android中ExpandableListView中嵌套ListView
- Linux进程间通信——使用信号量
- onTouch触摸事件
- C++第三次上机实验—友元函数
- 1869: Mathematics and Geometry
- 152. Maximum Product Subarray
- 在线笔试题汇总 4.12
- 切入Debug日志
- CentOS6网络配置
- C++作业3
- java CountDownLatch(闭锁)
- 最小步数
- Laxcus大数据管理系统2.0(5)- 第二章 数据组织
- 程序内存分析