Leetcode算法学习日志-152 Maximum Product Subarray
来源:互联网 发布:可以修改图片的软件 编辑:程序博客网 时间:2024/05/20 04:27
Leetcode 152 Maxinum 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
.
题意分析
给一组数据,求一个连续的子数组,使得子数组的乘积最大,输出这个最大值。
解法分析
本题如果采用暴力解法,复杂度为O(n^2),因此需要寻求O(n)的解法。本题采用动态规划的方法,令以第i个元素为最后一个元素的最大乘积数组的最大乘积为maxP[i],如果nums[i]为正数,则maxP[i]=max(maxP[i],maxP[i-1]*nums[i]),而当nums[i]<0时情况不同,此时maxP[i]与minP[i-1]有关。这种递归式会受nums[i]影响的动态规划方法需要两个数组来存储动态规划的中间结果。由于两组递归式都只与前一个元素相关,所以不需要用数组存储DP中间值,只需要分别用一个变量来存储。C++代码如下:
class Solution {public: int maxProduct(vector<int>& nums) { int n=nums.size(); if(n==1) return nums[0]; if(n==0) return 0; int i; int res=nums[0]; int lastMin=nums[0],nextMin; int lastMax=nums[0],nextMax; for(i=1;i<n;i++){ if(nums[i]<0){ nextMin=min(nums[i],lastMax*nums[i]); nextMax=max(nums[i],lastMin*nums[i]); } else{ nextMin=min(nums[i],lastMin*nums[i]); nextMax=max(nums[i],lastMax*nums[i]); } res=max(nextMax,res); lastMin=nextMin; lastMax=nextMax; } return res; }};
上诉代码可以优化如下:class Solution {public: int maxProduct(vector<int>& nums) { int maxProduct = nums[0]; int minProduct = nums[0]; int result = nums[0]; for(int i = 1; i < nums.size(); i++) { if(nums[i] < 0) swap(maxProduct, minProduct); maxProduct = max(maxProduct * nums[i], nums[i]); minProduct = min(minProduct * nums[i], nums[i]); result = max(maxProduct, result); } return result; }};
递归式左右用同一个变量存储,当遇到nums[i]<0时,只需swap(maxProdunct,minProduct)。阅读全文
0 0
- Leetcode算法学习日志-152 Maximum Product Subarray
- Leetcode算法学习日志-53 Maximum Subarray
- Leetcode(152) Maximum Product Subarray
- leetcode 152: Maximum Product Subarray
- [leetcode 152] Maximum Product Subarray
- [leetcode] 152 Maximum Product Subarray
- leetcode-152 Maximum Product Subarray
- Maximum Product Subarray - LeetCode 152
- LeetCode---(152)Maximum Product Subarray
- Leetcode 152 Maximum Product Subarray
- LeetCode(152) Maximum Product Subarray
- leetcode 152: Maximum Product Subarray
- leetcode 152 Maximum Product Subarray
- [leetcode] 152 Maximum Product Subarray
- LeetCode 152: Maximum Product Subarray
- LeetCode 152 Maximum Product Subarray
- LeetCode 152 Maximum Product Subarray
- LeetCode(152) Maximum Product Subarray
- 二.ARM裸机学习之S5PV210刷机
- 将spring cloud打包docker镜像
- ansible-playbook批量部署nginx
- angularjs中如何实现控制器和指令之间交互
- [NOIP2015]运输计划 树链剖分 二分 差分
- Leetcode算法学习日志-152 Maximum Product Subarray
- 第一次使用MarkDown写日志
- 倒水问题(广度优先搜索)
- 使用docker发布spring cloud应用
- Windows 2003下 IIS+PHP+mysql+ZendOptimizer的安装及配置
- framework下添加自定jni
- 解决:QSqlQuery出现parameter count mismatch
- 利用栈求解迷宫 --数据结构实验
- 关于微信小程序中链接使用canvas实时生成二维码使用保存至相册