day12:64. 最小路径和、300. 最长递增子序列、bytedance-004. 机器人跳跃问题

day12题目:64. 最小路径和300. 最长递增子序列bytedance-004. 机器人跳跃问题

学习计划链接:冲刺春招-精选笔面试 66 题大通关

今日知识点:数组、动态规划、二分,难度为中等、中等、字节の简单

昨日题目链接:冲刺春招-精选笔面试 66 题大通关 day11

64. 最小路径和

给定一个包含非负整数的 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原来的值直接覆盖。

代码

300. 最长递增子序列

给你一个整数数组 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 中最长递增子序列长度,每次在 0i-1 中找可以与当前 i 构成递增序列的 j ,取其中最大的那个作为 dp[i]

代码

bytedance-004. 机器人跳跃问题

机器人正在玩一个古老的基于 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(向上取整)那么从后往前遍历一遍即可。

代码

最后更新于

这有帮助吗?