152. 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.
- /*首先想到了和最大相加子串问题,但是不同的是以下两点:
1.任何数*0=0,解决方法有两种:
1.根据0的分布把数组分为几部分,每部分都不含0,分别求最大值,最后选最大的(若数组有0,且各部分比较结果是负数时,结果要取0)
2.每乘一个数都要保存最大值,当遇到0时,记录当前状态的变量置0
由于1需要存储0的位置,给程序带来额外开销,所以2较好
2.负数的存在会导致较小(大)的局部解后边可能会成为较大(小)的解,解决方法有两种(由于遇上0的问题已经解决,所以这里的算法都是在没有0的情况下):
1.配合1.1使用,统计负数个数,双数时直接把这部分全部相乘,单数时取【最后一个负数前所有值相乘结果】
和【第一个负数之后所有值相乘结果】这两个值的较大者
2.*动态规划的方法:设置最终解变量res和局部解变量max和min,局部变量设置两个的原因是负数的存在,动态方程:
当前值是正数时,max(i) = max(max(i-1)* nums(i),nums(i)),min(i) = min(min(i-1)* nums(i),nums(i))
当前值是负数时,max(i) = max(min(i-1)* nums(i),nums(i)) ,min(i) = min(max(i-1)* nums(i),nums(i))
比较之后可以发现,只要当遇上负数时,将max和min两个变量交换,则状态方程可以统一*/
动态规划:
- public int maxProduct1(int[] nums) {
- if (nums == null || nums.length == 0) return 0;
- //全局解
- int res = nums[0];
- for (int i = 1, max = res, min = res; i < nums.length; i++) {
- if (nums[i] < 0) {
- int temp = max;
- max = min;
- min = temp;
- }
- //状态方程
- max = Math.max(max * nums[i], nums[i]);
- min = Math.min(min * nums[i], nums[i]);
- if (max > res) res = max;
- }
- return res;
- }
操作数组方法:
- public int maxProduct2(int[] nums) {
- if (nums.length == 1)
- return nums[0];
- int res = 0;
- //数组记录0的位置
- List<Integer> l = new ArrayList<>();
- for (int i = 0;i < nums.length;i++)
- {
- if (nums[i] == 0)
- l.add(i);
- }
- //没有0的情况
- if (l.size() == 0)
- return product(0,nums.length,nums);
- //有0的情况
- else
- {
- //分为几部分求解
- res = Math.max(res,product(0,l.get(0),nums));
- for (int i = 1; i < l.size(); i++) {
- res = Math.max(res,product(l.get(i-1)+1,l.get(i),nums));
- }
- res = Math.max(res,product(l.get(l.size()-1)+1,nums.length,nums));
- return Math.max(res,0);
- }
- }
- public int product(int sta,int end,int[] nums)
- {
- if (sta > nums.length-1)
- return 0;
- if (end - sta <= 1)
- return nums[sta];
- int loc = 1;
- int num = 0;
- int index = 0;
- //数组记录第一个负数和最后一个负数的位置
- List<Integer> l = new ArrayList<>();
- for (int i = sta;i < end;i++)
- {
- if (nums[i] < 0)
- {
- num++;
- l.add(i);
- }
- }
- //双数情况
- if (num%2 == 0)
- {
- for (int i = sta;i < end;i++) {
- loc *= nums[i];
- }
- return loc;
- }
- //单数情况
- else
- {
- int loc1 = 1;
- int loc2 = 1;
- for (int i = sta;i < l.get(l.size()-1);i++ )
- {
- loc1 *= nums[i];
- }
- for (int i = l.get(0)+1;i < end;i++)
- {
- loc2 *= nums[i];
- }
- return Math.max(loc1,loc2);
- }
- }
152. Maximum Product Subarray动态规划连乘最大子串的更多相关文章
- leetcode 53. Maximum Subarray 、152. Maximum Product Subarray
53. Maximum Subarray 之前的值小于0就不加了.dp[i]表示以i结尾当前的最大和,所以需要用一个变量保存最大值. 动态规划的方法: class Solution { public: ...
- 152. Maximum Product Subarray - LeetCode
Question 152. Maximum Product Subarray Solution 题目大意:求数列中连续子序列的最大连乘积 思路:动态规划实现,现在动态规划理解的还不透,照着公式往上套的 ...
- 【刷题-LeetCode】152 Maximum Product Subarray
Maximum Product Subarray Given an integer array nums, find the contiguous subarray within an array ( ...
- 求连续最大子序列积 - leetcode. 152 Maximum Product Subarray
题目链接:Maximum Product Subarray solutions同步在github 题目很简单,给一个数组,求一个连续的子数组,使得数组元素之积最大.这是求连续最大子序列和的加强版,我们 ...
- [LeetCode] 152. Maximum Product Subarray 求最大子数组乘积
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- [LeetCode]152. Maximum Product Subarray
This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...
- LeetCode 152. Maximum Product Subarray (最大乘积子数组)
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- Leetcode#152 Maximum Product Subarray
原题地址 简单动态规划,跟最大子串和类似. 一维状态空间可以经过压缩变成常数空间. 代码: int maxProduct(int A[], int n) { ) ; ]; ]; ]; ; i > ...
- 152. Maximum Product Subarray(动态规划)
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
随机推荐
- Django----短信验证接口
1.注册荣联云账号 1.1注册账号 1.2 登录即可看到开发者账号信息 1.3 添加测试账号 2.使用容联云发送代码测试 '''1. 安装容联云sdk''' pip install ronglian_ ...
- IdentityServer4系列 | 资源密码凭证模式
一.前言 从上一篇关于客户端凭证模式中,我们通过创建一个认证授权访问服务,定义一个API和要访问它的客户端,客户端通过IdentityServer上请求访问令牌,并使用它来控制访问API.其中,我们也 ...
- python MD5加密和flask-generate_password_hash
实际开发过程中,有些数据是需要加密保存或者处理的,为了就是为了保证源数据的安全性.那么MD5加密作为一种简单有效的非对称加密方式在日常开发过程中也经常的被使用到.下面就来介绍下MD5算法: 1. * ...
- 喝完可乐桶后程序员回归本源,开源Spring基础内容
周六了,又是摸鱼的一天,今天还有点不在状态,脑瓜子迷迷糊糊的,昨晚出去喝可乐桶喝的脑子到现在都不是很正常(奉劝各位可以自己小酌:450ml威士忌+1L多一点可乐刚刚好,可能是我酒量不好),正好没啥事就 ...
- 转:Python常见字符编码及其之间的转换
参考:Python常见字符编码 + Python常见字符编码间的转换 一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Cod ...
- ADF 第一篇:Azure Data Factory介绍
Azure Data Factory(简写 ADF)是Azure的云ETL服务,简单的说,就是云上的SSIS.ADF是基于云的ETL,用于数据集成和数据转换,不需要代码,直接通过UI(code-fre ...
- java中的反射(一)
在之前学java基础时学习过反射,但在因为没有相应的应用场景,所以也是一知半解.最近在学spring的时候发现反射是其中很重要的一部分,所以回顾一下,并看看它在spring中的应用. 目录 一.反射 ...
- filebeat输出结果到elasticsearch的多个索引
基本环境: filebeat版本:6.5.4 (Linux,x86-64) elasticsearch版本:6.54 (一)需求说明 在一台服务器上有多个日志需要使用filebeat日志收集到el ...
- Android Studio中SVN的使用
1.忽略文件 1)这种方式,每次新建一个项目都要添加,并不是全局的. .idea文件夹 .gradle文件夹 所有的build文件夹 所有的.iml文件 local.properties文件 2)使用 ...
- STL——容器(Map & multimap)的查找
map.find(key); //查找键key是否存在,若存在,返回该键的元素的迭代器:若不存在,返回map.end(); map.count(key); //返回容器中键值为key的对组个数 ...