原题链接:https://leetcode-cn.com/problems/maximum-product-subarray/

思路是用两个数组,一个最大max[],一个最小min[]。然后用动态规划的思路,保存每个位置上的最大和最小,需要注意的是:当nums为负数时,与最大(正)相乘就会变成最小,与最小(负)相乘就会变成最大。但是最大不一定是正的,最小也不一定是负的,所以要分类讨论。

代码:

int maxProduct(vector<int>& nums) {int len=nums.size();vector<int> max(len,0);vector<int> min(len,0);max[0]=nums[0];min[0]=nums[0];for(int i=1;i<len;i++){if(nums[i]>0){max[i]=(max[i-1]>0)?max[i-1]*nums[i]:nums[i];min[i]=(min[i-1]<=0)?min[i-1]*nums[i]:nums[i];}else if(nums[i]<0){max[i]=(min[i-1]<=0)?min[i-1]*nums[i]:nums[i];min[i]=(max[i-1]>0)?max[i-1]*nums[i]:nums[i];}else if(nums[i]==0){max[i]=0;min[i]=0;}}sort(max.begin(),max.end());return max[len-1];}

但是这个代码还能再优化,其实条件判断可以直接改成

max[i]=max(max[i-1]*nums[i],nums[i])
min[i]=min(min[i-1]*nums[i],nums[i])

并且提前判断正负,并交换。然后最后在每次遍历的时候比较最大值,这样就不用开辟数组空间。

    int maxProduct(vector<int>& nums) {int len=nums.size();int imax=nums[0],imin=nums[0],max=imax;for(int i=1;i<len;i++){if(nums[i]<0) swap(imax,imin);imax=std::max(imax*nums[i],nums[i]);imin=std::min(imin*nums[i],nums[i]);max=std::max(imax,max);}return max;}

leetcode算法题--乘积最大子数组相关推荐

  1. LeetCode算法题个人笔记【数组】【简单1-5】【c++】

    资料来源于leetcode官网 记得多看评论! 听从大佬建议从同一类型题目开始做,首先决定做数组! 前面还有三道简单题已经做过了.共47道简单题 ** 第一题:搜索插入位置 ** 给定一个排序数组和一 ...

  2. LeetCode算法题个人笔记【数组】【简单6-10】【c++】

    ** 第六题:还是杨辉三角 ** 和 118 题 一样,依旧是杨辉三角.区别在于之前是输出所有层的数,这道题只需要输出第 k 层的数. 意思是说,我们只用一行vector< int> 就行 ...

  3. [Leedcode][JAVA][第152题][乘积最大子数组][动态规划]

    [问题描述][中等] 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积.示例 1:输入: [2,3,-2,4] 输出: 6 解 ...

  4. python【力扣LeetCode算法题库】912- 排序数组

    排序数组 给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] ...

  5. python【力扣LeetCode算法题库】945- 使数组唯一的最小增量

    使数组唯一的最小增量 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 示例 1: 输入:[1,2,2] 输出:1 解释: ...

  6. python【力扣LeetCode算法题库】1013-将数组分成和相等的三个部分(贪心)

    将数组分成和相等的三个部分 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] ...

  7. leetcode算法题--搜索旋转排序数组

    原题链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ 此题的特点是,以mid为中点,肯定有一半是有序的 首先判断t ...

  8. 动态规划——乘积最大子数组(Leetcode 152)

    题目选自Leetcode 152. 乘积最大子数组 题目描述: 解题思路: 解题代码: class Solution { public:int maxProduct(vector<int> ...

  9. 最大连续子数组和 动态规划_每日LeetCode,乘积最大子数组

    152. 乘积最大子数组​leetcode-cn.com 给你一个整数数组nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: ...

最新文章

  1. Ubuntu12.04配置JDK1.8
  2. electron builder 打包错误 cannot unpack electron zip file 解决方案
  3. think in java interview-高级开发人员面试宝典(三)
  4. 611. 有效三角形的个数
  5. 【ElasticSearch】es 线程池 ThreadPool 的封装
  6. 每个计算机主机有且只能有一块硬盘对不对,电子科技大学计算机基础试卷.doc...
  7. Trick(一)——判断一个数的位数
  8. php7异常抛出的好处,PHP7的错误与异常
  9. PHP 扩展 Mongo 与 MongoDB
  10. 随机森林的基分类器可否由决策树替换为线性分类器或者K-NN?
  11. QQ桌球瞄准器的球心计算算法
  12. IIR和FIR滤波器设计低通滤波器
  13. macpro台式计算机,回顾经典的苹果Mac台式机 你见过几个?
  14. crypto-js 加密解密 (TS版本)
  15. html文本框怎么加粗,html怎么让字体加粗
  16. iNode客户端“未收到服务器回应,即将强行下线,请检查终端能否正常访问网络或者与管理员联系”问题与解决方式...
  17. Mining Hero於ETHDenver峰會提交專案,整合IPFS應用場景
  18. UVA1335 Beijing Guards
  19. 基于鲁棒-距离平衡和基于学习的人工蜂群的强大优化算法(Matlab代码实现)
  20. 西藏,赴一场心灵之约

热门文章

  1. python可以做什么开发-Python能做什么,能够开发什么项目?
  2. python的none是什么-python中stream=None什么意思?
  3. python官网下载步骤64位-Python 3.7 64位下载
  4. 中国最大的python社区-python中的最小最大算法
  5. python单词大全-python常用的单词
  6. python电脑软件下载-Python for windows
  7. Mint系统使用介绍,Mint系统安装,在Mint系统上搭建GPU环境,在Mint系统上安装Pycharm、Anaconda等软件,在Mint系统上安装cuda和cudnn
  8. 计算机专业名词术语raid,RAID中的9个专业术语详解
  9. UVa1062 - Containers贪心算法
  10. LeetCode Find All Duplicates in an Array