连续子序列的最大和

  • 前言

    • 分治算法的核心思想是将一个规模很大的问题化简为n个规模较小的问题,这些子问题虽然独立而不同,但是问题的本质是一致的,从而达到分而治之的目的。
    • 首先通过“分”将问题分解为n个子问题,再将子问题一步步分解,知道达到最小的子问题。这时,“治”子问题再利用子问题的解推导总问题的解。
    • 子问题应与原问题拥有同样的结构,或者拥有同样的形式。只有这样,才能利用递归解决子问题。
  • 问题描述
    • 给定一个列表数据,其中数据可正可负,找出和最大的子列表的和,子列表不能为空。
  • 问题分析
    • 这类题其实用DP也是一种解题思路,当然也是分治的经典问题。
    • 看一个例子,输入列表如下。
      • [-2, 1, -3, 4, -1, 2, 1, -5, 4]
      • 按照分治的思路,最大子列表有可能在左子列表、右子列表或左子列表和右子列表之间。我们需要做的就是找到左子列表的最大子列表的和、右子列表的最大子列表的和、左子列表与右子列表之间的子列表的最大和,再进行比较。
      • 如何找到左子列表与右子列表的最大子列表的和呢?分治的想法是:让左左子列表与右子列表的子列表回答这个问题就好了,此时此刻不需要知道答案,只需要知道答案有三种可能。
      • 现在需要做的是找到第三种可能,也就是左子列表与右子列表之间的子列表的最大和。设一个中点,遍历中点左边的值,跟踪记录已经遍历过的值的总和,取这些总和的最大值;同样的方法遍历中点右边的值。最后,左边的最大值加上右边的最大值加上中点值就是想要的值。
      • 那么如何找第一种可能,也就是左子列表的最大和。其实,对待左子列表的方式和对待列表一样,还是有三个可能,第一个与第二个不关心,第三个按照上面的做法寻找。
      • 如何找到第二种可能与上面一致。
      • 按照这个一步步分解的思路,其实,最后左右子列表都各有一个值,结果为三种可能最大的。最终,根据子问题推到了大问题的三种可能值,最终得到答案。
  • 代码
    •   # -*-coding:utf-8-*-def LSS(array):if array == []:returnif len(array) == 1:return array[0]cut = len(array) // 2  # 设置中点left_sum = LSS(array[: cut])right_sum = LSS(array[cut:])# 从中点开始分别左右遍历查值left_middle_sum = 0max_l = 0right_middle_sum = 0max_r = 0for i in range(cut-1, -1, -1):left_middle_sum += array[i]max_l = max(left_middle_sum, max_l)for j in range(cut+1, len(array), 1):right_middle_sum += array[j]max_r = max(right_middle_sum, max_r)return max(left_sum, right_sum, max_l+max_r+array[cut])if __name__ == '__main__':array = [-2, 1, -3, 4, -1, 2, 1, -5, 4]rst = LSS(array)print(rst)
      
  • 运行结果
  • 补充说明
    • 具体代码可以查看我的Github,欢迎Star或者Fork
    • 参考书《你也能看得懂的Python算法书

分治算法-01连续子序列的最大和问题相关推荐

  1. 【Py面试题】找到数组或整数列表中连续子序列的最大和

    测试面试题 找到数组或整数列表中连续子序列的最大和 找到数组或整数列表中连续子序列的最大和,并满足以下条件: 列表仅由正数组成并且最大和是整个数组的总和. 如果列表仅由负数组成,则返回 0 空列表被认 ...

  2. 【恋上数据结构】贪心(最优装载、零钱兑换、0-1背包)、分治(最大连续子序列和、大数乘法)

    贪心.分治 贪心(Greedy) 问题1:最优装载(加勒比海盗) 问题2:零钱兑换 零钱兑换的另一个例子 贪心注意点 问题3:0-1背包 0-1 背包 - 实例 一些习题 分治(Divide And ...

  3. 动态规划--连续子序列的最大和

    给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最大连续子序列是所有连续 ...

  4. 算法--最大连续子序列和(动态规划,分而治之)

    今天在LeetCode上遇到一个求最大连续子序列和的问题,如下: Given an integer array nums, find the contiguous subarray (containi ...

  5. 求数组非连续子序列的最大和

    题目描述: 1. 一个整数数组L,如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和.这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻.例如, ...

  6. 最大子序列求和_连续子序列最大和与乘积问题的分析

    问题描述 给定(可能是负的)整数序列A1, A2,...,AN, 寻找(并标识)使Sum(Ak)(k >=i, k <= j)的值最大的序列.如果所有的整数都是负的,那么连续子序列的最大和 ...

  7. 编程珠玑第八章——分治算法求解数组中的最大的连续和

    关键在于把数组分为两个部分a,b.最大的连续和要么在a要么在b,另外还有可能就是跨越a,b的边界,将跨越边界的最大向量称为mc. 一个注意的地方就是mc正在a中的部分包含右边边界的最大子向量,而mc在 ...

  8. 数据结构与算法--分治算法-最大子序列和问题

    分治算法 用于设计算法的一种常用技巧–分治算法(divide and conquer).分治算法由两部分组成: 分(divide):递归然后借机较小的问题(基础情况除外) 治(conquer):然后从 ...

  9. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

最新文章

  1. iphone怎么重启_苹果手机进入itunes怎么退出
  2. SAP云服务新订购量增长103%
  3. 机房空调清理杨柳絮操作
  4. python 下划线转驼峰_json字符串中key值下划线命名转换为驼峰命名
  5. 一些实用的编程模式 | Options模式
  6. linux的tcpdump命令详解,tcpdump命令
  7. goroutine并发扫描MySQL表_goroutine 并发之搜索文件内容
  8. 开发老人笔记:Git 常用命令清单
  9. GD32VF103(riscv)与STM32F103性能对比
  10. 【adb命令】电脑操作手机adb命令大全
  11. 博物馆管理系统解决方案
  12. 数据科学Python库01:Pandas
  13. Unix风雨五十年:老兵远去,新秀崛起
  14. 用 JavaScript 编写日历
  15. vue对象属性为null_vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题...
  16. Android8.0 WIFI ap Tethering 相关知识
  17. Top-down Visual Saliency Guided by Captions
  18. 【sfu】network线程和主线程
  19. 麻省理工学院从算法层面揭示男女配对的自然法则(扎心真相!!!)
  20. mysql用于检索的关键字_Mysql全文搜索match...against的用法

热门文章

  1. MySQL 数据存储文件
  2. 复制文件的异常处理【应用】
  3. canal数据同步(canal安装)
  4. 用户操作-登录代码实现
  5. FileFilter过滤器的原理和使用
  6. ES6新特性之函数优化-函数属性简写、箭头函数和解构表达式结合使用
  7. 数据库-多条件查询-优先级
  8. 重写Object类的equals方法
  9. 返回index.html页面
  10. mysql在linux下配置_mysql数据库在Linux下安装与配置