获取生成数组中的最大值--利用树的性质做题

题目

题目描述

解题分析

读完题目,我们根据这个递推关系,可以看出,这是 i2*i 以及 2*i+1 之间的关系,很明显这是一个数组型二叉树中子与父的关系,同样,只要 i>=1 则它的父亲结点一定是 i/2 ,根据题中关系nums[2 * i + 1] = nums[i] + nums[i + 1]可知,每一个 i 不仅可能与 i/2 有关系,一旦 i 为奇数,则还与 i/2+1 有关,所以得出推导式:
dp[i] = dp[i/2] + i%2*dp[i/2+1]

  • 实际它给出关系的时候,就已经可以用数学中的换元法把题目中的 i*2 或者 i*2+1 换成 i 了。

解题代码

C++解题

class Solution {
public:
    int getMaximumGenerated(int n) {
        if (n == 0) {
            return 0;
        }
        vector<int> nums(n + 1);
        nums[1] = 1;
        for (int i = 2; i <= n; ++i) {
            nums[i] = nums[i / 2] + i % 2 * nums[i / 2 + 1];
        }
        return *max_element(nums.begin(), nums.end());
    }
};

Go语言

func getMaximumGenerated(n int) (ans int) {
    if n == 0 {
        return
    }
    nums := make([]int, n+1)
    nums[1] = 1
    for i := 2; i <= n; i++ {
        nums[i] = nums[i/2] + i%2*nums[i/2+1]
    }
    for _, v := range nums {
        ans = max(ans, v)
    }
    return
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值