算法题每日一练---第43天:获取生成数组中的最大值

332 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、问题描述

给你一个整数 n 。按下述规则生成一个长度为 n + 1 的数组 nums :

  • nums[0] = 0
  • nums[1] = 1
  • 当 2 <= 2 * i <= n 时,nums[2 * i] = nums[i]
  • 当 2 <= 2 * i + 1 <= n 时,nums[2 * i + 1] = nums[i] + nums[i + 1]

返回生成数组 nums 中的 最大 值。

题目链接:获取生成数组中的最大值

二、题目要求

样例

输入: n = 7
输出: 3
解释: 根据规则:
  nums[0] = 0
  nums[1] = 1
  nums[(1 * 2) = 2] = nums[1] = 1
  nums[(1 * 2) + 1 = 3] = nums[1] + nums[2] = 1 + 1 = 2
  nums[(2 * 2) = 4] = nums[2] = 1
  nums[(2 * 2) + 1 = 5] = nums[2] + nums[3] = 1 + 2 = 3
  nums[(3 * 2) = 6] = nums[3] = 2
  nums[(3 * 2) + 1 = 7] = nums[3] + nums[4] = 2 + 1 = 3
因此,nums = [0,1,1,2,1,3,2,3],最大值 3

考察

1.动态规划中等题型
2.建议用时15~30min

三、问题分析

今天是刷动态规划的第10天了,具有代表性的选了10多道入门题在专栏里,过几天开刷动态规划进阶的题目。

10.png

动态规划没做过的可以这一篇开启动态规划之旅:算法题每日一练---第34天: 青蛙跳台阶

还是用我们的三步走,老套路:

第一步 含义搞懂:

这一题,我刚看时和之前的一篇:算法题每日一练---第42天:比特位计数文章本质上差不多,都是利用数字的奇偶性寻找性质,作为动态规划的切入口。

题目中dp[i]就代表第i个数字的值。

第二步 变量初始:

初始变量,原题描述给了,分别是:

dp[0]=0;
dp[1]=1;

第三步 规律归纳:

题目虽然说2 * i、2*i+1的关系,我们反过来想,其实就是:

  • 若 i 为偶数,dp[i]=dp[i/2];
  • 若 i 为奇数,dp[i]=dp[i/2]+dp[i/2+1];

三步走,打完收工!

四、编码实现

class Solution {
public:
    int getMaximumGenerated(int n) {
        int i,dp[n+2],m;//初始化
        if(n==0) return 0;//只有一个,返回0
        if(n==1) return 1;//返回1
        dp[0]=0,dp[1]=1,m=1;//变量初始
        for(i=2;i<=n;i++)
        {
           if(i%2==0)
           {
               dp[i]=dp[i/2];//规律归纳
           }
           else
                dp[i]=dp[i/2]+dp[i/2+1];//规律归纳
            m=max(m,dp[i]);
        }
        return m;输出结果
    }
};

五、测试结果

2.png

1.png