LeetCode刷题笔记-动态规划-day6 我会带着你远行 2023-10-01 18:12 1阅读 0赞 #### 文章目录 #### * LeetCode刷题笔记-动态规划-day6 * * 152. 乘积最大子数组 * * 1.题目 * 2.解题思路 * 3.代码 * 1567. 乘积为正数的最长子数组长度 * * 1.题目 * 2.解题思路 * 3.代码 ## LeetCode刷题笔记-动态规划-day6 ## ### 152. 乘积最大子数组 ### #### 1.题目 #### > 原题链接:[152. 乘积最大子数组][152.] ![image-20220212101240798][] #### 2.解题思路 #### 算法:动态规划 + 滚动数组优化 1. f\[i\]表示所有从0到i并且选用a\[i\]获得的最大乘积 2. g\[i\]表示所有从0到i并且选用a\[i\]获得的最小乘积 则有这样几种情况: * 当a\[i\] >= 0时,f\[i\] = max(a\[i\], f\[i - 1\] \* a\[i\]) * 当a\[i\] < 0时,f\[i\] = max(a\[i\], g\[i - 1\] \* a\[i\]) * 当a\[i\] >= 0时,g\[i\] = min(a\[i\], g\[i - 1\] \* a\[i\]) * 当a\[i\] < 0时,g\[i\] = min(a\[i\], f\[i - 1\] \* a\[i\]) 可以合并为: 1. 当`a[i] >= 0`时 `f[i] = max(a[i], max(f[i-1] * a[i],g[i-1]*a[i]))` 2. 当`a[i]<0`时`f[i] = max(a[i], max(g[i-1] * a[i],f[i-1]*a[i])` 可以用滚动数组优化空间。详细见代码。 #### 3.代码 #### class Solution { public: int maxProduct(vector<int>& a) { int f=a[0],g=a[0]; int res=a[0]; for(int i=1;i<a.size();i++){ int t=a[i],fa=f*t,ga=g*t; f=max(t,max(fa,ga)); g=min(t,min(fa,ga)); res=max(res,f); } return res; } }; ### 1567. 乘积为正数的最长子数组长度 ### #### 1.题目 #### > 原题链接:[1567. 乘积为正数的最长子数组长度][1567.] ![image-20220212101316030][] #### 2.解题思路 #### 算法:动态规划 我们可以用两个数组`f[i]`和`g[i]`: * `f[i]`表示以下标i结尾乘积为正数的最长子数组长度 * `g[i]`表示以下标i结尾乘积为负数的最长子数组长度 这里我们可以得到递推公式: 1. 如果当前数大于0,即`nums[i]>0`,之前的乘积乘以当前数,正负性是不会发生改变的,所以: 1. `f[i]=f[i-1]+1` 2. 如果`g[i-1]`不等于0的话,才加一,如果g\[i-1\]本身为0,这里为正数也不会改变 2. 如果当前数小于0,即`nums[i]<0`,之前的乘积乘以当前数会改变乘积的正负性,所以: 1. 这时候`g[i]`应该等于`f[i-1]+1`,因为`f[i-1]`包含的数乘积是正数,乘以当前数刚好为负数。 2. `f[i]`需要考虑`g[i-1]`情况,如果`g[i-1]`为0,这里`f[i]`也还是为0,否则`f[i]=g[i-1]+1`,负数乘负数为正数 3. 如果当前数为0,即`nums[i]==0`,将`f[i]`,`g[i]`赋值为0 4. 每次遍历维护最大值:`res=max(res,f[i]);` #### 3.代码 #### class Solution { public: int getMaxLen(vector<int>& nums) { int f=0,g=0; if(nums[0]>0) f=1; else if(nums[0]<0) g=1; int res=f; for(int i=1;i<nums.size();i++){ if(nums[i]>0){ f++; g=(g==0)?0:g+1; }else if(nums[i]<0){ int t=f; f=(g==0)?0:g+1; g=t+1; }else{ f=0,g=0; } res=max(res,f); } return res; } }; ![在这里插入图片描述][watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBATEwuTEVCUk9O_size_20_color_FFFFFF_t_70_g_se_x_16] [152.]: https://leetcode-cn.com/problems/maximum-product-subarray/ [image-20220212101240798]: https://img-blog.csdnimg.cn/img_convert/904eb1cc036627171767aa545ddba513.png [1567.]: https://leetcode-cn.com/problems/maximum-length-of-subarray-with-positive-product/ [image-20220212101316030]: https://img-blog.csdnimg.cn/img_convert/b86dfa8cacb9e31c2f44152ea4c7a673.png [watermark_type_d3F5LXplbmhlaQ_shadow_50_text_Q1NETiBATEwuTEVCUk9O_size_20_color_FFFFFF_t_70_g_se_x_16]: https://img-blog.csdnimg.cn/6124fd5f09c24647832b9464ffd3ccdb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATEwuTEVCUk9O,size_20,color_FFFFFF,t_70,g_se,x_16
相关 Leetcode 专项刷题题解---- 动态规划 Leetcode 专项刷题题解---- 动态规划 递归和动态规划都是将原问题拆成多个子问题然后求解,他们之间最本质的区别是,动态规划 保存了子问题的解,避免重复计算。 绝地灬酷狼/ 2024年03月26日 22:07/ 0 赞/ 87 阅读
相关 LeetCode刷题笔记-动态规划-day6 文章目录 LeetCode刷题笔记-动态规划-day6 152. 乘积最大子数组 1.题目 2.解题思路 我会带着你远行/ 2023年10月01日 18:12/ 0 赞/ 2 阅读
相关 LeetCode刷题笔记-数据结构-day18 文章目录 LeetCode刷题笔记-数据结构-day18 236. 二叉树的最近公共祖先 1.题目描述 2.解 蔚落/ 2023年10月01日 17:05/ 0 赞/ 1 阅读
相关 LeetCode刷题笔记-数据结构-day16 文章目录 LeetCode刷题笔记-数据结构-day16 199. 二叉树的右视图 1.题目描述 2.解题思路 电玩女神/ 2023年10月01日 17:03/ 0 赞/ 29 阅读
相关 LeetCode刷题笔记-数据结构-day9 文章目录 LeetCode刷题笔记-数据结构-day9 187.重复的DNA序列 1.题目描述 2.解题思路 骑猪看日落/ 2023年10月01日 16:28/ 0 赞/ 10 阅读
相关 LeetCode刷题笔记-数据结构-day8 文章目录 LeetCode刷题笔记-数据结构-day8 49.字母异位词分组 1.题目描述 2.解题思路 ゝ一世哀愁。/ 2023年10月01日 16:10/ 0 赞/ 2 阅读
相关 LeetCode刷题笔记-数据结构-day7 文章目录 LeetCode刷题笔记-数据结构-day7 90.单词规律 1.题目描述 2.解题思路 悠悠/ 2023年10月01日 16:02/ 0 赞/ 24 阅读
相关 动态规划刷题 分金子(360公司2017春招真题) 题目链接 https://exercise.acmcoder.com/online/online\_judge\_ques?q 红太狼/ 2023年07月18日 06:58/ 0 赞/ 14 阅读
相关 动态规划刷题总结 题目1: 输出描述: 对于每组数据,输出一个整数,代表最长递增子序列的长度(不需要连续)。 输入例子: 2 7 89 256 7 逃离我推掉我的手/ 2022年09月24日 15:28/ 0 赞/ 201 阅读
相关 LeetCode刷题——Day5 14、[最长公共前缀][Link 1] 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 `""`。 思路:如果数组为空或者长度为0,就直 £神魔★判官ぃ/ 2022年03月26日 03:36/ 0 赞/ 241 阅读
还没有评论,来说两句吧...