美文网首页
数组中非相邻数最大和

数组中非相邻数最大和

作者: mysimplebook | 来源:发表于2019-11-07 19:15 被阅读0次

给定一个数组,相邻的的数不能同时选,求从该数组中选出若干数,使它们的和最大。

分析:

    一看到求和最大,意味着求一个最优解。方法不外乎递归+回溯、动态规划。

   考虑到数组很容易从其一个较小的规模出发去分析解题思路。子问题与原问题形式一样,记住已经解决过的子问题的解,由子问题的解推导出原问题的解。很明显该题同时符合动态规划的两大特征:最优子结构、重叠子问题。

    只要满足最优子结构性质就可以使用动态规划,如果还具有子问题重叠,则更能彰显动态规划的优势。

   以dp[i]记录截止到第i个元素为止,所能求得的符合约束条件的最大和。该位置处的值的来源有两个dp[i-2]+alist[i]和dp[i-1],很明显我们需要取最大的一个。

    初始dp[0]=0元素值,dp[1]=max(1元素值,dp[0])

    若要找出选中了哪些元素,一般采用回溯法。

python代码如下

def nonadjacentnum_maxsum(alist):

    length=len(alist)

    dp=[0]*length

    dp[0]=alist[0]

    for i in range(1,length):

        if i==1:

            dp[i]=max(dp[0],alist[1])

        else:

            dp[i]=max(dp[i-2]+alist[i],dp[i-1])

    #回溯

    selnum=[]

    i=length-1

    ele=dp[length-1]        #初始

    while i>=0 :

        if i==0:

            selnum=[alist[0]]+selnum

            break

        if dp[i-1]==ele:            #找到相邻两个元素不同时,右边的dp[i],它对应的alist[i]就是选中的元素

            i-=1

        else:

            ele=dp[i]

            selnum=[alist[i]]+selnum

            i-=2           #跳过一个元素

    return dp,selnum

测试用例

>>> nonadjacentnum_maxsum([2])

([2], [2])

>>> nonadjacentnum_maxsum([2,4,7,0,10,1])

([2, 4, 9, 9, 19, 19], [2, 7, 10])

>>> nonadjacentnum_maxsum([2,1,4])

([2, 2, 6], [2, 4])

>>> nonadjacentnum_maxsum([2,1])

([2, 2], [2])

>>>

相关文章

  • 数组中非相邻数最大和

    给定一个数组,相邻的的数不能同时选,求从该数组中选出若干数,使它们的和最大。 分析: 一看到求和最大,意味着求...

  • Leetcode_53 Maximum Subarray

    给定一个整数数组,找到一个具有最大和的连续子数组 (子数组最少包含一个数),返回其最大和。 例如,给定数组 [-2...

  • LintCode 41. 最大子数组

    题目描述 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。 子数组最少包含一个数。挑战:要求时间复杂度...

  • Leetcode.162.Find Peak Element

    题目 给定一个数组, 找到一个数比相邻的数都要大, 假设 nums[-1] = nums[n] = -∞, 输出数...

  • OJ lintcode 最大子数组

    给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。注意事项子数组最少包含一个数您在真实的面试中是否遇到过...

  • 冒泡排序

    将数组相邻的两个元素比较,将小的数和大的数交换位置,否则不交换

  • 动态规划

    1子序列的最大和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最...

  • ios 数组排序一些基础方法

    数组翻转 数组升序 数组降序 获取数组对象和,平均数,最大值,最小值 冒泡排序 原理:比较两个相邻的元素,将值大的...

  • 常见的排序算法

    冒泡排序将小的元素慢慢冒的最顶端算法流程:比较相邻的两个数,如果前一个数,比后一个数大,则交换,直到数组的末尾 选...

  • 力扣 162 寻找峰值

    题意:给定一个数组,找出一个比相邻两个数大的数 思路:二分搜索数组 如果中间的数比后一个数大,那么e更新为m,因为...

网友评论

      本文标题:数组中非相邻数最大和

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