打地鼠
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 458 ms, 内存: 38.2 MB
/*
* 思路:
* 1. 使用流式编程对数据进行过滤和映射。
* 2. 使用动态规划 (DP) 数组记录最优状态。
* 3. 最后使用流求解最大值。
*/
import java.util.stream.IntStream;
public class WhackAMoleStream {
public int maxMoles(int[][] moles) {
int[][][] dp = new int[1001][3][3];
for (int[] mole : moles) {
int t = mole[0], x = mole[1], y = mole[2];
IntStream.range(0, 3).forEach(i -> IntStream.range(0, 3).forEach(j -> {
int distance = Math.abs(x - i) + Math.abs(y - j);
if (distance <= t) {
dp[t][x][y] = Math.max(dp[t][x][y], dp[t - distance][i][j] + 1);
}
}));
}
return IntStream.range(0, 1001).flatMap(t -> IntStream.range(0, 3).flatMap(i -> IntStream.range(0, 3).map(j -> dp[t][i][j]))).max().orElse(0);
}
}
解释
方法:
该题解采用了动态规划的方法。首先,对特殊情况,即锤子在第0秒就能敲击到的地鼠进行处理,特别是当地鼠位于中心点(1,1)时。接着,将所有地鼠事件按时间顺序排序,并用一个动态规划数组f[i]来记录在达到第i个事件时,最多能敲击的地鼠数量。数组p_max用于快速获取前j个事件中最大的敲击数,以优化性能。在转移方程中,如果两个事件之间的时间差足够锤子从一个事件的位置移动到另一个位置,则尝试更新f[i]。这个方法综合考虑了时间和位置的约束,以达到最优解。
时间复杂度:
O(n^2)
空间复杂度:
O(n)
代码细节讲解
🦆
在处理t=0时刻的特殊情况,如果有多只地鼠同时在不同位置出现,该如何选择优先敲击哪只地鼠?
▷🦆
在动态规划数组f的初始化中,为什么将moles1数组中添加一个[0, 1, 1]的元素,这个操作有什么特别的意义或用途?
▷