刷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;
    }
};
相关推荐
2501_924747111 小时前
驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
人工智能·算法·计算机视觉·智能手机
limitless_peter2 小时前
优先队列,链表优化
c++·算法·链表
屁股割了还要学4 小时前
【数据结构入门】栈和队列
c语言·开发语言·数据结构·学习·算法·青少年编程
Monkey的自我迭代4 小时前
支持向量机(SVM)算法依赖的数学知识详解
算法·机器学习·支持向量机
阿彬爱学习5 小时前
AI 大模型企业级应用落地挑战与解决方案
人工智能·算法·微信·chatgpt·开源
L.fountain5 小时前
配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
算法·配送
啊阿狸不会拉杆8 小时前
《算法导论》第 13 章 - 红黑树
数据结构·c++·算法·排序算法
qiuyunoqy8 小时前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝
lifallen9 小时前
Kafka ISR机制和Raft区别:副本数优化的秘密
java·大数据·数据库·分布式·算法·kafka·apache
m0_6265352010 小时前
贪心算法学习 3 买卖股票的最佳时机 i ii
学习·算法·贪心算法