leetcode maximum product subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4]
,
the contiguous subarray [2,3]
has the largest product = 6
.
Subscribe to see which companies asked this question
一道medium的题目,我自己的思考过程复杂化了,首先我先想到的是可能出现的情况,如果负数为偶数的话,就是正数了,那么返回自身就好;如果负数为奇数,要看最后一个负数前面的子串和后面的子串的product谁大。还有0的情况,数组里有几个0,就会将数组分成几个部分,于是觉得这道题复杂极了。对于medium的题,我每次先自己怂了。==
后来看了一个别人的解法。思路非常清晰:首先获得最大的product就三种情况;curMax保存当前最大子串的乘积,curMin保存当前最小子串的乘积。
第一种:如果nums[i]>0,那么max=curMax*nums[i];
第二种:如果nums[i]<0,那么max=curMin*nums[i];
第三种:max=nums[i]
这样思路就比较简单也比较清楚。而且时间复杂非常低。之后我也附上“暴力破解”。
class Solution { public: int maxProduct(vector<int>& nums) { int temp=0; int len=nums.size(); if(len<=0) return 0; if(len==1) return nums[0]; int curMax=nums[0]; int curMin=nums[0]; int result=nums[0]; for(int i=1;i<len;i++){ temp=curMin*nums[i]; curMin=min(nums[i],min(temp,curMax*nums[i])); curMax=max(nums[i],max(temp,curMax*nums[i])); result=max(result,curMax); } return result; } };
暴力破解:
// 思路:用两个指针来指向字数组的头尾 int maxProduct(int A[], int n) { assert(n > 0); int subArrayProduct = -32768; for (int i = 0; i != n; ++ i) { int nTempProduct = 1; for (int j = i; j != n; ++ j) { if (j == i) nTempProduct = A[i]; else nTempProduct *= A[j]; if (nTempProduct >= subArrayProduct) subArrayProduct = nTempProduct; } } return subArrayProduct; }
感觉有些题目要从结果来分析,就像这道题,而有的题目要从条件来分析就像以前做的有些题目。心得,哈哈。