Dynamic Programming学习笔记 (29) - 获取生成数组中的最大值 (力扣# 1646)

121 阅读1分钟

本题出自力扣题库第1646题。题面大意如下:

给定一个整数 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,1,1,2,1,3,2,3],最大值是 3 

解题思路:

本题没有特别的难点,直接使用给定的规则生成整个数组,并逐一比较以获得最大值即可。

Java代码如下:

class Solution {
    public int getMaximumGenerated(int n) {
        if (n <= 1) {
            return n;
        }

        int nums[] = new int[n + 1];
        nums[0] = 0;
        nums[1] = 1;

        int result = 1;

        for (int i = 2; i <= n; i ++) {
            if (i % 2 == 0) {
                nums[i] = nums[i / 2];
            } else {
                nums[i] = nums[ (i - 1) / 2] + nums[(i - 1)/2 + 1];
            }
            result = Math.max(nums[i], result);
        }

        return result;
    }
}

以上代码可以进一步优化以减少所需的数组大小。