题目描述:

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

示例 1:

输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:

输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目思路:

还是动态规划的问题。

设置dp[nums.length][2]

dp[i][0]表示必须包含第i个数值,前面这一段区间的乘积最大值。

dp[i][1]表示必须包含第i个数值,前面这一段区间的乘积最小值。

状态转移方程:

dp[i][0] = Math.max(Math.max(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i]);

dp[i][1] = Math.min(Math.min(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i]);

题目代码:

public int maxProduct(int[] nums) {
int[][] dp = new int[nums.length][2];
dp[0][0] = nums[0];//最大值
dp[0][1] = nums[0];//最小值
int max = nums[0]; for (int i = 1; i < nums.length; i++) {
dp[i][0] = Math.max(Math.max(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i]);
dp[i][1] = Math.min(Math.min(dp[i - 1][0] * nums[i], dp[i - 1][1] * nums[i]), nums[i]);
if(dp[i][0] > max) {
max = dp[i][0];
}
}
return max;
}

这代码还可以进一步优化,使得空间复杂度更小,因为每次值依赖上一次的结果,所以数组的行数只设为2即可。

public int maxProduct(int[] nums) {
int[][] dp = new int[2][2];
dp[0][0] = nums[0];//最大值
dp[0][1] = nums[0];//最小值
int max = nums[0]; for (int i = 1; i < nums.length; i++) {
dp[i % 2][0] = Math.max(Math.max(dp[(i - 1) % 2][0] * nums[i], dp[(i - 1) % 2][1] * nums[i]), nums[i]);
dp[i % 2][1] = Math.min(Math.min(dp[(i - 1) % 2][0] * nums[i], dp[(i - 1) % 2][1] * nums[i]), nums[i]);
if(dp[i % 2][0] > max) {
max = dp[i % 2][0];
}
}
return max;
}

最新文章

  1. 菜鸟学Struts2——Actions
  2. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)D Dense Subsequence
  3. linux块设备驱动之实例
  4. AES加密补位填充的一个问题
  5. php版本历史
  6. app打包流程
  7. Hadoop集群系类文章
  8. js发送post请求下载文件
  9. Python collections模块总结
  10. 基于C#的BarCode 39实现
  11. ASP.NET学习笔记 —— 一般处理程序之图片上传
  12. Windows下的命令神器Cmder
  13. 一条命令解决mac版本python IDLE无法输入中文问题
  14. 【java提高】---HashSet 与TreeSet和LinkedHashSet的区别
  15. java基础之Number
  16. Linux下解包/打包,压缩/解压命令
  17. 跟我学SharePoint 2013视频培训课程——理解SharePoint网站的体系结构(3)
  18. C# user32.dll
  19. android事件分发
  20. 4.26-python学习笔记(变量及命名、字符串、格式化字符串print,format,%...)

热门文章

  1. JS调用MD5加密
  2. java8-CompleableFuture的使用1
  3. Web安全测试学习笔记-DVWA-登录密码爆破(使用Burp Suite)
  4. SpringCloud微服务(04):Turbine组件,实现微服务集群监控
  5. navicat 12激活
  6. Selenium(三):操控元素的基本方法
  7. PHP实现支付宝登录
  8. Java注解简单学习
  9. 【C#】学习笔记 Linq相关
  10. jira添加工作流