最大连续子数组和(算法导论算法实现)

博客主要介绍了如何实现算法导论中的最大连续子数组和算法,特别强调了核心算法和分治策略的理解。首先解释了算法的核心思想,即通过选取数组中点,分别向左右延伸求和并找到最大子数组。接着,博主提到了算法修正,以确保数组元素较少时仍能得到正确结果。文章还讨论了分治策略,并指出通过递归地处理小数组,可以找到整个数组的最大子数组。此外,博主在代码实现中注意了数组的处理,包括使用指针和动态分配内存,以及避免使用可能导致溢出的vector。最后,提供了代码实现的提示。
摘要由CSDN通过智能技术生成

啊啊啊啊啊!算法导论关于这部分类容的讲解在分治策略的第一节。然而网易公开课上本书的配套mit课程里的老师并没有讲,可能人家觉得不值得讲吧。

  1. 核心算法
    对于给定的数组,取其中点,记ans=-inf,先从中点向左延伸,不断求和,每求和一次就更新一下ans使其成为最大,记下使ans最大的点为left。再从中点向右延伸求和,更新另一个和最大值ans,记下使其最大的那个点right。最终,跨越中点的子数组就是从left到right的所有元素。
  2. 核心算法修正
    修正算法使得当数组数量很少时结果依然正确,比如当数组只有一个元素时结果为它本身
  3. 分治
    最考验脑力的地方是这里的理解
    简单来说,假如一个数组只含有a,b两个元素,那么总的最大和应为max({a,b},a,b)即:整个数组跨越中点的值,左边元素,右边元素,这些中的最大值。而左边元素的值恰好是其本身跨越其中点的最大值,右边元素也是其本身跨越其中点的最大值。因为我们先对算法做了修正。
    这个时候,我们发现,对于四个元素,我们只需要将左右两边的最大值分别当成新数组的元素,这个新数组仅仅包含了两个最大值为元素。
    不难发现,无论数组多大,只要能够将其分解为两个以下元素的小数组,就能通过max函数和层层迭代求得整个答案。

理解我的代码需要注意的地方

  1. 数组作为函数参数。
    显然数组不能直接作为参数,所以我用到了指针。用指针来传递数组元素时,元素的内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值