LeetCode之Maximum Product Subarray

来源:互联网 发布:例外女装淘宝 编辑:程序博客网 时间:2024/06/05 00:13
/*如果数组中没有元素0,那么可以按照如下方法处理:1.统计数组中负数的个数;2.如果负数个数为偶数,则结果为数组所有元素相乘;3.如果负数个数为奇数,结果为一下2种情况的最大值:  1)第一个负数后所有元素的乘积;  2)最后一个负数前的所有元素的乘积;所有,可以根据数组中0所在的位置,将原数组分割成一段一段不含0的子数组,用如上方法进行处理,获得最后结果。时间复杂度为O(n)。*/class Solution {public:int maxProduct(vector<int>& nums) {if(nums.size() == 1) return nums[0];int first(0);while(first < nums.size() && nums[first] == 0) ++first;int tmp_res(INT_MIN);if(first == nums.size()) return 0;int res(INT_MIN);for(int i = first; i < nums.size(); ){//求取子数组的最大连续乘积值if(nums[i] == 0){int tmp = maxProduct(nums, first, i-1);res = max(res, tmp);tmp_res = 0;first = i;while(nums[first] == 0) ++first;i = first;}else if(i == nums.size() - 1){    int tmp = maxProduct(nums, first, i);    res = max(res, tmp);    break;}else ++i;}return max(res, tmp_res);}int maxProduct(vector<int> &nums, int left, int right){//获得不含0元素的子数组的最大连续乘积if(left == right) return nums[left];int first(INT_MAX), last(INT_MIN), neg_count(0);for(int i = left; i < right + 1; ++i){if(nums[i] < 0){if(i < first) first = i;if(i > last) last = i;++neg_count;}}if((neg_count & 1) == 0){//偶数个负数int res(1);for(int i = left; i < right + 1; ++i) res *= nums[i];return res;}else{int res1(1);for(int i = first + 1; i < right + 1; ++i) res1 *= nums[i];int res2(1);for(int i = left; i < last; ++i) res2 *= nums[i];return max(res1, res2);}}};

0 0
原创粉丝点击