day12:64. 最小路径和、300. 最长递增子序列、bytedance-004. 机器人跳跃问题
最后更新于
最后更新于
day12题目:64. 最小路径和、300. 最长递增子序列、bytedance-004. 机器人跳跃问题
学习计划链接:冲刺春招-精选笔面试 66 题大通关
今日知识点:数组、动态规划、二分,难度为中等、中等、字节の简单
昨日题目链接:冲刺春招-精选笔面试 66 题大通关 day11
给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明: 每次只能向下或者向右移动一步。
示例 1:
示例 2:
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
一眼动态规划的题目
dp[i][j]表示到达(i,j)这个点的最小路径和
转移公式为dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
先初始化第一行第一列,由于dp过程中只涉及相邻的两个结点,故可以将grid原来的值直接覆盖。
给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的子序列。
示例 1:
示例 2:
示例 3:
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
进阶:
你能将算法的时间复杂度降低到 O(n log(n))
吗?
动态规划,dp[i]
表示 0~i
中最长递增子序列长度,每次在 0
到 i-1
中找可以与当前 i
构成递增序列的 j
,取其中最大的那个作为 dp[i]
机器人正在玩一个古老的基于 DOS 的游戏。游戏中有 N+1 座建筑——从 0 到 N 编号,从左到右排列。编号为 0 的建筑高度为 0 个单位,编号为 i 的建筑的高度为 H(i) 个单位。 起初, 机器人在编号为 0 的建筑处。每一步,它跳到下一个(右边)建筑。假设机器人在第 k 个建筑,且它现在的能量值是 E, 下一步它将跳到第个 k+1 建筑。它将会得到或者失去正比于与 H(k+1) 与 E 之差的能量。如果 H(k+1) > E 那么机器人就失去 H(k+1) - E 的能量值,否则它将得到 E - H(k+1) 的能量值。 游戏目标是到达第个 N 建筑,在这个过程中,能量值不能为负数个单位。现在的问题是机器人以多少能量值开始游戏,才可以保证成功完成游戏?
格式:
示例 1: 输入
输出
示例 2:
输入
输出
示例 3:
提示:
1 <= N <= 10^5
1 <= H(i) <= 10^5
没什么思路,去看了一眼评论恍然大悟。这题核心是解一下方程,虽然题意忽悠我们说了一大堆,实际上是这样的: 设当前编号为 i
,高度为h[i]
,能量为e[i]
,则想到下一个点有 e[i+1] = e[i]+(e[i]-h[i+1])
或者 e[i+1] = e[i]-(h[i+1]-e[i])
,可以发现这两者其实都是等价 e[i+1] = 2*e[i]-h[i+1]
的,故当最后一个也就是 e[n-1]
为0时初始所需能量最少,即 2*e[i]-h[i+1] = 0
时,解得 e[i] = h[i+1]/2
(向上取整)那么从后往前遍历一遍即可。