IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode-D23-动态规划(二刷)-152. 乘积最大子数组&1567. 乘积为正数的最长子数组长度 -> 正文阅读

[数据结构与算法]Leetcode-D23-动态规划(二刷)-152. 乘积最大子数组&1567. 乘积为正数的最长子数组长度

152. 乘积最大子数组

1、用的dp,但考虑到乘积的正负没法直接用,卡了一下。突然想起来之前用过两个dp,一个记录负乘积一个记录正乘积。先记录个想法,我去请个假。
2、
写了一下,不太对。

    n = len(nums)
    dp_f = [-1] +[0]*n
    dp_z = [1]+[0]*n
    for i in range(1,n+1):
        if nums[i]>0:
            dp_z[i] = max(dp_z[i-1]*nums[i],nums[i])
            dp_f[i] = dp_f[i-1]*nums[i]
        if nums[i]<0:
            dp_z[i] = dp_f[i-1]*nums[i]
            dp_f[i] = min(dp_z[i-1]*nums[i],nums[i])
        if nums[i]==0:
            dp_z[i]=0
            dp_f[i]=0
    return dp_z[n]

我发现不好初始化dp_f[0]=-1,这样有一个正的就会增大dp_f,而实际上并不能取到。有点困了,回家好好做吧、
3、酒足饭饱,吃了羊蝎子、盘挞和其他东西,现在要写题啦~
用脑子改了一下,过了,但是不够完美,看个答案吧~
我用了两个dp,分别记录以nums【n】结尾的最大正、负连乘。当nums【n+1】是整数的时候,那dp_z【n+1】=max(nums【n+1】,nums【n+1】*dp【n】)因为有可能dp【n】=0,所以取个max,至于dp_f[n+1],就等于dp_f[n]*nums[n+1],无论dp_f【n】是负是0,都满足。同理nums[n+1]<0的情况。初始化就初始化dp_f/z[0]=0即可。

class Solution:
    def maxProduct(self, nums: List[int]) -> int:   
        n = len(nums)
        if n==1:
            return nums[0]
        dp_f =[0]*(n+1)
        dp_z = [0]*(n+1)
        for i in range(1,n+1):
            if nums[i-1]>0:
                dp_z[i] = max(dp_z[i-1]*nums[i-1],nums[i-1])
                dp_f[i] = dp_f[i-1]*nums[i-1]
            if nums[i-1]<0:
                dp_z[i] = dp_f[i-1]*nums[i-1]
                dp_f[i] = min(dp_z[i-1]*nums[i-1],nums[i-1])
            if nums[i-1]==0:
                dp_z[i]=0
                dp_f[i]=0
        return max(dp_z)

在这里插入图片描述
4、看了答案,两个dp不理解为正负,理解为当前最小最大应该更好一些。

1567. 乘积为正数的最长子数组长度

1、有思路了,去试一下
2、没看出来哪里错了呀

class Solution:
    def getMaxLen(self, nums: List[int]) -> int:
        n = len(nums)
        dp_z = [0]*(n+1)
        dp_f = [0]*(n+1)

        for i in range(1,n+1):
            if nums[i-1]>0:
                dp_z[i] = dp_z[i-1]+1
                if dp_f[i-1]==0:
                    dp_f[i]=0
                if dp_f[i-1]>0:
                    dp_f[i]+=1
            if nums[i-1]<0:
                dp_f[i] = dp_z[i-1]+1
                if dp_f[i-1]==0:
                    dp_z[i]=0
                if dp_f[i-1]>0:
                    dp_z[i] = dp_f[i-1]+1
            if nums[i-1]==0:
                dp_f[i]=0
                dp_z[i]=0

            return max(dp_z)

鹅鹅鹅应该是return的indent不太对
3、除了这个,还有一行代码写的不对

                    dp_f[i] = dp_f[i-1]+1

之前写成dp_f[i] +=1了。
这个应该是如果之前dp_f[i-1]>0,乘上一个正数,此时dp_f[i]就会等于dp_f[i-1]+1。如果等于0的话,意味着之前连续乘积没有负数,那再乘一个正数,也不会有负数,那dp_f[i]就仍为0.

今天题先做到这里啦~回家的感觉真好!!!我去搞搞毕业设计!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 14:11:59  更:2022-01-01 14:14:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:40:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码