c语言sscanf函数的用法是什么
311
2022-08-28
动态规划攻略之:获取生成数组中的最大值
题目
给你一个整数 n 。按下述规则生成一个长度为 n + 1 的数组 nums :
nums[0] = 0nums[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]
示例3:
输入:n = 3输出:2解释:根据规则,nums[0]、nums[1]、nums[2] 和 nums[3]
解题思路
根据题意,我们可以推断出如下的规则:
当 i 为奇数时,nums[i] = nums[i/2] + nums[i/2+1];当 i 为偶数时,nums[i] = nums[i/2];
俩者都有 nums[i/2],于是我们可以将上述俩种情况合并为: nums[i] = nums[i/2] + (i%2)*nums[i/2+1],当 i 为偶数时,i%2 就为0,奇数时 i%2 则为 1。
代码实现
class Solution { public int getMaximumGenerated(int { if (n == 0) { return 0; } int[] nums = new int[n + 1]; nums[0] = 0; nums[1] = 1; int max = 1; for (int i = 2; i <= n; i++) { nums[i] = nums[i/2] + (i%2)*nums[i/2 + 1]; if (nums[i] > max) { max = nums[i]; } } return
最后
时间复杂度:O(n);
空间复杂度:O(n);
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~