一、题目
给你一个整数 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 中的 最大值。
点击查看原题
难度级别: 简单
二、思路
1)数组记录
根据数据规则,i
位置的元素依赖于i/2
位置或也依赖于i/2+1
位置的元素
所以建立数组memo
记录以及计算过的元素
三、代码
1)数组记录
class Solution {
public int getMaximumGenerated(int n) {
if (n <= 1) {
return n;
}
int[] memo = new int[n+1];
memo[1] = 1;
int ans = 1;
for (int i = 2; i <= n; i++) {
if ((i&1) == 1) {
memo[i] = memo[i >> 1] + memo[(i >> 1) + 1];
} else {
memo[i] = memo[i >> 1];
}
ans = Math.max(ans, memo[i]);
}
return ans;
}
}
时间复杂度为O(n)
,空间复杂度为O(n)