分治算法

作者: Arsenal4ever | 来源:发表于2020-01-04 21:14 被阅读0次

核心思想:分解---解决---合并

一次股票买入卖出问题可以转换成寻找最大连续子数组问题。

case1:[1, -2, 3, -4, 5, -6]
case2:[1, 3, -4, -3, 8, -1, -2, -3, 4]
case3:[9, -8, 3, 4, -5, 6]

可用贪心解决,维护最大连续子数组之和(max_sum)和最大的最大连续子数组之和(max_max_sum)的堆

这篇写分治,用分治解决:

先找出中间位置,最大连续子数组和能落在中间左边,也可能落在中间右边,还可能跨越中间值。

如果落在两边的话,直接从中间扫描过去就好了!!!

如果跨越中间值,从中间往左扫找到左半区间,在从中间往右扫找到右半区间,拼接在一起!完事!!!

下面是 python 代码,写之前先想好输入和输出:

先设计输入和输出:

def findmaxArray(target, low, high):
  # 合并部分
   if low == high:
      return (low, high, target[high])
   # 解决部分
   mid = (low + high) // 2
   leftLow, leftHigh, leftMaxSum = findmaxArray(target, low, mid)
   rightLow, rightHigh, rightMaxSum = findmaxArray(target, mid+1, high)
   corssLow, crossHigh, crossMaxSum = findmaxArrayCrossMid(target, low, mid, high)
   # 合并部分
   if leftMaxSum >= rightMaxSum and leftMaxSum >= crossMaxSum:
      return (leftLow, leftHigh, leftMaxSum)
   elif rightMaxSum >= leftMaxSum and rightMaxSum >= crossMaxSum:
      return (rightLow, rightHigh, rightMaxSum)
   else:
      return (corssLow, crossHigh, crossMaxSum)


def findmaxArrayCrossMid(target, low, mid, high):
   leftSum, rightSum = 0, 0
   leftMaxSum, rightMaxSum = float('-inf'), float('-inf')
   for i in range(mid, low - 1, -1):
      leftSum += target[i]
      if leftSum > leftMaxSum:
         leftMaxSum = leftSum
         crossLow = i
   for i in range(mid+1, high + 1):
      rightSum += target[i]
      if rightSum > rightMaxSum:
         rightMaxSum = rightSum
         crossHigh = i
   return (crossLow, crossHigh, leftMaxSum + rightMaxSum)

if __name__ == '__main__':
   target = [1, -2, 3, -4, 5, -6]
   t = findmaxArray(target, 0, len(target)-1)
   print(t)
   target = [1, 3, -1, -2, 8, -1, -2, -3, 4]
   t = findmaxArray(target, 0, len(target)-1)
   print(t)
   target = [9, -8, 3, 4, -5, 6]
   t = findmaxArray(target, 0, len(target)-1)
   print(t)

    

相关文章

  • 分治算法

    文章结构 如何理解分治算法 分治算法应用举例 1. 如何理解分治算法 1.1 分治算法的核心思想 分治算法的核心思...

  • 算法导论第2.3章 - 分治算法

    分治算法 递归:算法一次或多次递归地调用其自身已解决紧密相关的若干子问题。这些算法遵循分治法的思想。 分治算法三个...

  • 从分治算法到 MapReduce

    从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 。其实就...

  • Leetcode-Java(二十五)

    241. Different Ways to Add Parentheses 采用分治算法,分治算法的基本思想是将...

  • 09《算法入门教程》分治算法

    1. 前言 本节内容是分治算法系列之一:分治算法的介绍,主要介绍了分治算法的定义及基本思想和实现策略,然后我们介绍...

  • 分治算法

    理解分治算法 分而治之

  • 分治算法

    分治是一种思想体现,就是把一个大的问题分为若干个子问题,这些子问题相互独立且与原问题性质相同然后在子问题继续向下分...

  • 分治算法

    分治算法字面意思就是将一个复杂的数据进行分开计算,分治 的策略就是: 一个分治法将规模为n的问题分成k个规模为n/...

  • 分治算法

    http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741...

  • 分治算法

    分冶算法的基本思想是将原问题分解为几个规模较小的但类似原问题的子问题,递归地求解这些了问题,然后再合并这些子问题的...

网友评论

    本文标题:分治算法

    本文链接:https://www.haomeiwen.com/subject/hvmzoctx.html