当前位置: 首页 > news >正文

刷leetcode hot100--动态规划3.12

第一题乘积max子数组[1h++]

emmmm感觉看不懂题解

线性dp【计划学一下acwing,挨个做一下】

线性动态规划 相似题解析 最长上升子序列 最大上升子序列和 最大连续子段和 乘积最大子数组_哔哩哔哩_bilibili

比较奇怪的就是有正负数和0,如何处理?

核心是维护一个max和min

//全是整数【负数,0,正数】,乘积max,连续子数组

        //暴力求解??起始i,终止j,遍历

        //dp[n]以nums[n]结束的连续子数组的max乘积

        //初始化dp[n] = nums[n]

        //有负数怎么办??,或者说其实是整数的话,只用关注0,负数

        //负数和0如何处理

        //负数和0分开处理,负数看奇数偶数,0分左右两边/就是0

        //看了评论区,两个能合起来:负数偶数【不用管,遍历取max】,

        //首先不用管0,因为int a = 1,int max = nums[0],如果遇到0,a = 1即可

        //负数:负数奇数【若无0,则为左边数组,右边数组取max】,有0,分成两半,看左边负数个数,右边负数个数,依旧是无0的操作

        //一个很厉害的方法是从左向右和从右向左遍历一次,负数??取max

        //dp想法是维护min和max

题解:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        long maxF = nums[0], minF = nums[0], ans = nums[0];
        for (int i = 1; i < nums.size(); ++i) {
            long mx = maxF, mn = minF;
            maxF = max(mx * nums[i], max((long)nums[i], mn * nums[i]));
            minF = min(mn * nums[i], min((long)nums[i], mx * nums[i]));
            if(minF<INT_MIN) {
                minF=nums[i];
            }
            ans = max(maxF, ans);
        }
        return ans;
    }
};

相关文章:

  • RHCE大纲
  • std::ranges::views::reverse, std::ranges::reverse_view
  • 什么是 Java 的 SPI(Service Provider Interface)机制?
  • doris:外表统计信息
  • mock的定义和使用场景
  • LORA中 软提示是什么
  • LoRA,DoRA,RSLoRA,LoRA+ 是什么
  • STM32外部中断
  • 复现 MoGe
  • 计算机网络:Socket编程 Tcp协议 第二弹
  • 传智杯-省赛-第二场(B组)题解
  • 限制数据库字段长度的公用写法:length和like和rlike对于限制字段长度的原理与区别
  • 【技海登峰】Kafka漫谈系列(九)SpringBoot整合Kafka多数据源配置
  • BFS最短路径(十六)127. 单词接龙 困难
  • 爬虫案例十四js逆向中国五矿
  • 2.库函数的模拟实现
  • ES怎么通过客户端操作和查询/curl操作指令
  • DeepBI驱动的动态预算与库存联动调整策略
  • 当AI回答问题时,它的“大脑”里在炒什么菜?
  • LoRa无线通讯边缘网关-EG2000-数据上云和远程组网
  • 四部门:到2025年底,全国行政村5G通达率超过90%
  • 【社论】个人破产探索,要守住“诚实而不幸”的底线
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额5万元
  • 王毅人民日报撰文:共商发展振兴,共建中拉命运共同体
  • 2025年上海科技节5月17日启动,56家重点实验室和大科学设施将向公众开放
  • 金价大跌!足金饰品每克一夜便宜14元,涨势是否已终结?