53. Maximum Subarray
之前的值小于0就不加了。dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值。
动态规划的方法:
class Solution { public: int maxSubArray(vector<int>& nums) { vector<int> dp(nums.size()); int res = INT_MIN; for(int i = 0;i < nums.size();i++){ dp[i] = nums[i]; if(i > 0 && dp[i-1] >= 0) dp[i] += dp[i-1]; res = max(res,dp[i]); } return res; } };
152. Maximum Product Subarray
最小值可能是负数,这个值可能变成最大值。
dp[i]表示以i结尾当前的最大乘积,所以需要用一个变量保存最大值。
为什么每次要与nums[i]做对比,因为数组中可能存在0
动态规划的方法:
class Solution { public: int maxProduct(vector<int>& nums) { vector<int> dp_max(nums.size()); vector<int> dp_min(nums.size()); dp_max[0] = nums[0]; dp_min[0] = nums[0]; int res = nums[0]; for(int i = 1;i < nums.size();i++){ dp_max[i] = max(dp_max[i-1] * nums[i],max(dp_min[i-1] * nums[i],nums[i])); dp_min[i] = min(dp_max[i-1] * nums[i],min(dp_min[i-1] * nums[i],nums[i])); res = max(res,dp_max[i]); } return res; } };
非动态规划,节省空间的方法:
https://blog.csdn.net/whuwangyi/article/details/39577455解法3
class Solution { public: int maxProduct(vector<int>& nums) { int max = nums[0]; int pre_max = nums[0],pre_min = nums[0]; int cur_max,cur_min; for(int i = 1;i < nums.size();i++){ cur_max = compare_max(pre_max*nums[i],pre_min*nums[i],nums[i]); cur_min = compare_min(pre_max*nums[i],pre_min*nums[i],nums[i]); pre_max = cur_max; pre_min = cur_min; max = cur_max > max ? cur_max : max; } return max; } int compare_max(int a,int b,int c){ int max = a; if(b > max) max = b; if(c > max) max = c; return max; } int compare_min(int a,int b,int c){ int min = a; if(b < min) min = b; if(c < min) min = c; return min; } };