最大系列

  • 1.LeetCode-239 滑动窗口的最大值
  • 2.LeetCode-53 连续子数组的最大和
  • 3.LeetCode-152 乘积最大的子数组。
  • 4.剑指 Offer 14- I. 剪绳子为k个整数段,使各个段成绩最大
    • 1.dp
    • 数学推导

1.LeetCode-239 滑动窗口的最大值

窗口由左往右最大值数组Left,和由右向左最大值数组right维护。

在这里插入代码片
    def maxSlidingWindow(self, nums: 'List[int]', k: 'int') -> 'List[int]':n = len(nums)if n * k == 0:return []if k == 1:return numsleft = [0] * nleft[0] = nums[0]right = [0] * nright[n - 1] = nums[n - 1]for i in range(1, n):# from left to rightif i % k == 0:# block startleft[i] = nums[i]else:left[i] = max(left[i - 1], nums[i])# from right to leftj = n - i - 1    # i = 1, j = n-2if (j + 1) % k == 0:# block endright[j] = nums[j]else:right[j] = max(right[j + 1], nums[j])output = []for i in range(n - k + 1): # i=[0,n-k)output.append(max(left[i + k - 1], right[i]))return output

2.LeetCode-53 连续子数组的最大和

借助连续性,如果某一块的和为负数,这一块不会作为和最大连续子数组的开头,因为去掉这个部分,后半段加和会更大。
动态规划的解题思路:dp[i] 以nums[i]结尾的连续子数组的最大和,dp[i] 只与dp[i-1]有关,空间约减后,空间复杂度为0(1)

    def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""res = float("-INF")dp = 0for val in nums:dp += val        # [-1]  先加,更新答案,确定是否归零res = max(dp, res)dp = max(dp, 0)return res

3.LeetCode-152 乘积最大的子数组。

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

直接思路:fmax(i)f_{max}(i)fmax​(i)表示以第i个元素结尾的乘积最大的子数组的积,状态转移方程为
fmax(i)=max⁡i=1n{f(i−1)∗ai,ai}f_{max}(i)=\max_{i=1}^n\{f(i-1)*a_i,a_i\} fmax​(i)=i=1maxn​{f(i−1)∗ai​,ai​}
即,fmax(i)f_{max}(i)fmax​(i)可以考虑nums[i]加入前面fmax(i−1)f_{max}(i-1)fmax​(i−1)对应的一段,或者自成一段,这两种情况取最大值,求出所有的f_i之后,选取一个最大的作为结果。

核心问题:当前位置的最优解不一定是由前一个位置的最优解得到。因为存在正负数

如果当前的数是负数的话,我们希望以num[i-1]为结尾的某一个段的积也是一个负数,负负可以为正。

如果当前数为正,我们希望以num[i-1]为结尾的某一个段的积也是一个正数,正的越多,乘积完越大。

所以再维护一个fmin(i)f_{min}(i)fmin​(i)表示以第i个元素结尾的乘积最小的子数组的积:
fmax(i)=max⁡{fmax(i−1)∗ai,fmin(i−1)∗ai,ai}fmin(i)=min⁡{fmax(i−1)∗ai,fmin(i−1)∗ai,ai}f_{max}(i)=\max\{f_{max}(i-1)*a_i,f_{min}(i-1)*a_i,a_i\}\\ f_{min}(i)=\min\{f_{max}(i-1)*a_i,f_{min}(i-1)*a_i,a_i\}fmax​(i)=max{fmax​(i−1)∗ai​,fmin​(i−1)∗ai​,ai​}fmin​(i)=min{fmax​(i−1)∗ai​,fmin​(i−1)∗ai​,ai​}

def maxProduct(self, nums):""":type nums: List[int]:rtype: int"""pre_max, pre_min = 1, 1res = float("-INF")for val in nums:cur_max = max(pre_max * val, pre_min * val, val)cur_min = min(pre_max * val, pre_min * val, val)pre_max, pre_min = cur_max, cur_minres = max(res, cur_max)return res

4.剑指 Offer 14- I. 剪绳子为k个整数段,使各个段成绩最大

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

1.dp

dp[i]: 长度为i 绳子至少剪了一次的最长长度
dp[i]=max(dp[j]∗(i−j),j∗(i−j),dp[i]),j∈[1,i−1]dp[i] = max(dp[j]*(i-j),j*(i-j),dp[i]),j\in[1,i-1]dp[i]=max(dp[j]∗(i−j),j∗(i−j),dp[i]),j∈[1,i−1]

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""dp = [0]*(n+1)dp[1] = 1for i in range(2,n+1):for j in range(1,i):dp[i]= max(dp[i],dp[j]*(i-j),j*(i-j))return dp[-1]

n^2复杂度的DP

数学推导

通过数学不等式推到,可以得到,当每段长度为3时乘积最大。所以尽可能分为三段,最后一段依据具体情况判断:

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""if n<=3:return n-1s, mod = n //3, n % 3   if mod == 0:res = 3**selif mod == 1:res = 3**(s-1)*4 else:res = 3**s*2return res%(10**9+7)

算法(27)-最大系列相关推荐

  1. 【机器学习基础】数学推导+纯Python实现机器学习算法30:系列总结与感悟

    Python机器学习算法实现 Author:louwill Machine Learning Lab 终于到了最后的总结.从第一篇线性回归的文章开始到现在,已经接近有两年的时间了.当然,也不是纯写这3 ...

  2. 人工智能算法通俗讲解系列(二):逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 今天,我们介绍的机器学习算法叫逻辑回归.它英语名称是Logistic Regression,简称LR. 跟之前一样,介绍这个算 ...

  3. 化工热力学补考成功,几天没有头脑了,赶紧赏自己几题Leetcode动态规划算法最长系列

    @Author:Runsen @Date:2020/10/9 "恭喜你昨天,化工热力学补考成功!" "区区化工热力学还想让我重修,只不过浪费了我九月一半的精力和十月的九成 ...

  4. 数据结构与算法(C#实现)系列---树

    Heavenkiller(原创) 首先我们给树下一个定义: 树是一个有限的.非空的结点集, T={r} or T1 or T2 or-or Tn 它具有下列性质: 1.集合指定的结点r叫做树的根结点 ...

  5. shell sort 最后一列排序_十个必知的排序算法|Python实例系列[1]

    实例内容: 十个必知的排序算法具体代码,并简略的得知每种算法对于不同长度数列的排序时间 十大排序: 1.冒泡排序2.选择排序3.插入排序4.希尔排序5.归并排序6.快速排序7.堆排序8.计数排序9.桶 ...

  6. 算法刷题系列(四)蓝桥杯python算法训练3(下)

    上一次的节点选择算法由于春节过年耽搁了,现在重新补上 上篇链接:算法刷题系列(四)蓝桥杯python算法训练3 - 经验教训 在纷繁复杂的使用了列表来暂存数据之后,发现其实可以利用笔者自己不太常用的字 ...

  7. 【Java数据结构及算法实战】系列002:算法的四种描述方式

    本节是<Java数据结构及算法实战>系列的第2节,主要介绍描述算法的常用的4种方式. 要定义一个算法,我们可以用自然语言.流程图.伪代码的方式描述解决某个问题的过程或是编写一段程序来实现这 ...

  8. 分布式共识算法(拜占庭容错算法)的系列整理一:PBFT、PoW、PoS、DPos

    五篇分布式共识系列文章合集: 分布式共识算法(拜占庭容错算法)的系列整理一:PBFT.PoW.PoS.DPos 分布式共识算法(故障容错算法)系列整理(二):Bully.Gossip.NWR 分布式共 ...

  9. 算法洗脑系列(8篇)——第八篇 概率思想

    今天写最后一篇来结束这个系列,我们知道很多算法解决问题的步骤都是固定的,而概率算法每一步的选择都是随机的, 当在某些领域问题中通常比最优选择省时,所以就大大提高了算法的效率,降低了复杂度. 一:思想 ...

最新文章

  1. 两个使用 Pandas 读取异常数据结构 Excel 的方法,拿走不谢!
  2. SQL Server 2012笔记分享-49:理解数据库快照
  3. Request对象的主要方法有哪些?
  4. 利用脚本将文字插入到图片或进行多个图片拼接
  5. 准时制 jit 减少库存
  6. Docker 镜像优化与最佳实践
  7. oracle的globalname后缀,在Oracle 11g下查看数据库的global_name
  8. 法语:世界上最有辨识度的语言
  9. ESB 分布式处理技术 Remoting
  10. c语言函数使用的三个步骤,sqrt函数怎么使用 C语言中的sqrt函数使用方法介绍
  11. 《数字图像处理》:直方图处理的几种方式
  12. Python之生成器练习
  13. LLVM SSA 介绍
  14. vue 引入字体图标显示方块
  15. HTML、CSS 前端面试题收集
  16. 2019年最佳黑客书籍 - 初级到高级
  17. 计算机网络—网关介绍
  18. 计算机c语言基础字符,2008计算机二级考试:C语言基础教程-C语言字符型数据
  19. 基于SSM二手交易平台
  20. UCI数据集数据的分析 ——葡萄酒数据

热门文章

  1. 测试鼠标双击_鼠标环境可靠性测试是什么
  2. Java学习笔记—生产者和消费者模式
  3. 累积分布函数_C7: 概率函数和分布函数Distribution Function
  4. 【转】C#进阶系列——WebApi 接口参数不再困惑:传参详解
  5. C#语言之“string格式的日期时间字符串转为DateTime类型”的方法
  6. [你必须知道的.NET]第十八回:对象创建始末(上)
  7. [Sharepoint2007对象模型]第一回:服务器场(SPFarm)
  8. vs c语言 多线程demo,一个多线程的Socket通信Demo(C语言实现)
  9. linux里qt画直线_Qt与Web混合开发(一)简单使用
  10. Python 数据分析三剑客之 Matplotlib(八):等高线 / 等值线图的绘制