1. 问题描述:
给你一个整数 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:
输入: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
示例 2:
输入:n = 2
输出:1
解释:根据规则,nums[0]、nums[1] 和 nums[2] 之中的最大值是 1
示例 3:
输入:n = 3
输出:2
解释:根据规则,nums[0]、nums[1]、nums[2] 和 nums[3] 之中的最大值是 2
提示:
0 <= n <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/get-maximum-in-generated-array
2. 思路分析:
分析题目可以知道我们模拟整个数组元素的生成过程即可,需要分情况进行讨论这样根据奇数与偶数情况确定循环的次数:当n为奇数的时候那么遍历的次数为n / / 2,因为每一次循环可以生成两个数组元素,例如当n = 7的时候,那么总的元素个数为8,一开始nums[0],nums[1]已知所以总共还需要生成6个元素,所以三次循环就可以了,因为python语言for循环中是取不到右端点的所以当n为奇数的时候需要在除以2的基础上加1,因为是偶数是可以整除2的,所以当为偶数的时候循环的长度也为n // 2,但是当n为偶数的时候生成的元素长度为奇数个所以需要在循环结束之后生成数组中的最后一个元素,我们可以在生成元素的时候就比较数组元素中的最大值,对结果集进行更新即可,这种题目结合具体的例子会更好编写代码
3. 代码如下:
class Solution:
def getMaximumGenerated(self, n: int) -> int:
if n == 0: return 0
if n == 1: return 1
# 分为偶数与奇数的两种情况
nums = [0] * (n + 1)
res = 1
nums[0], nums[1] = 0, 1
length = n // 2
if n % 2 != 0:
# 奇数
length += 1
for i in range(1, length):
nums[2 * i] = nums[i]
nums[2 * i + 1] = nums[i] + nums[i + 1]
res = max(res, nums[2 * i], nums[2 * i + 1])
if n % 2 == 0: nums[n] = nums[n // 2]
return max(res, nums[n])