【力扣】2400. 恰好移动 k 步到达某一位置的方法数目
题目

解题思路

观察上面示例,容易画出下面的递归树,因此可以考虑DFS。

DFS
很容易写出DFS的代码
class Solution {
int res = 0; //记录可行路径数
public int numberOfWays(int startPos, int endPos, int k) {
dfs(startPos, endPos, k);
return res;
}
void dfs(int startPos, int endPos, int k){
// 递归边界,走了k步
if(k == 0){
// 走到终点了,答案加一
if(startPos == endPos){
res++;
}
return;
}
// 向左走
dfs(startPos - 1, endPos, k - 1);
// 向右走
dfs(startPos + 1, endPos, k - 1);
}
}
记忆化搜索
上述代码可以解决示例1,对于规模大一点的例子就超时,说明思路是对的,接下来就是优化了,自然的想法就是加个备忘录,那就要考虑是否存在重叠子问题。
对于示例1,下图展示了存在的重叠子问题。

在上图中,当前的坐标和剩余 k 步就是问题的状态,因此加一个二维数组备忘录 memo。
注意:由于坐标可能是负值,所以可以用 startPos + 偏移 来防止数组索引为负值。
class Solution {
// 备忘录
int[][] memo;
// 取余
int MOD = 1000000000 + 7;
public int numberOfWays(int startPos, int endPos, int k) {
// 初始化备忘录
memo = new int[6000 + 10][6000 + 10];
for(int[] arr : memo){
Arrays.fill(arr, -1);
}
return dfs(startPos, endPos, k);
}
int dfs(int startPos, int endPos, int k){
// 已经计算过该子问题,则直接返回
if(memo[startPos + 3000][k] != -1){
return memo[startPos + 3000][k];
}
// 走完 k 步
if(k == 0){
if(startPos == endPos){ // 走到终点了,是一种方法
memo[startPos + 3000][k] = 1;
}else{ // 没有走到终点,方案数为0
memo[startPos + 3000][k] = 0;
}
return memo[startPos + 3000][k];
}
// 记录往左走和往右走的方案总数
int res = 0;
// 加上往左走的方案数
res += dfs(startPos - 1, endPos, k - 1);
// 加上往右走的方案数
res += dfs(startPos + 1, endPos, k - 1);
// 结果求余
memo[startPos + 3000][k] = res % MOD;
return memo[startPos + 3000][k];
}
}
【力扣】2400. 恰好移动 k 步到达某一位置的方法数目的更多相关文章
- 【力扣leetcode】-787. K站中转内最便宜的航班
题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...
- 力扣 - 560. 和为K的子数组
目录 题目 思路1(前缀和) 代码 复杂度分析 思路2(前缀和+哈希表优化) 代码 复杂度分析 题目 560. 和为K的子数组 思路1(前缀和) 构建前缀和数组,可以快速计算任意区间的和 注意:计算区 ...
- 力扣Leetcode 55. 跳跃游戏
跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...
- 力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现
题目描述: 中文: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序 ...
- 刷题-力扣-230. 二叉搜索树中第K小的元素
230. 二叉搜索树中第K小的元素 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a ...
- 刷题-力扣-1738. 找出第 K 大的异或坐标值
1738. 找出第 K 大的异或坐标值 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-co ...
- 力扣 - 剑指 Offer 22. 链表中倒数第k个节点
题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...
- 【力扣】973. 最接近原点的 K 个点
我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...
- 【力扣】有序矩阵中第K小的元素
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素.请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 示例: matrix = [ [ 1, 5, ...
- 力扣992.K个不同整数的子数组-C语言实现
题目 原题链接 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续.不一定独立的子数组为好子数组. (例如,[1,2,3,1,2] 中有 3 个不同的整数: ...
随机推荐
- c语言中 -> 的用法
->是一个整体,它是用于指向结构体. 1.换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到"->&quo ...
- JS逆向实战6-- x轴 y轴 过点触验证码
点触验证码是一种常见的反爬手段 解决方案有两种:一种是直接解决,这需要深度学习机器学习等图像处理技术,以大量的数据训练识别模型,最终达到模型足矣识别图片中的文字提示和应该点击的区域之间的对应关系. 这 ...
- 论文笔记 - PRISM: A Rich Class of Parameterized Submodular Information Measures for Guided Subset Selection
Motivation 与 Active Learning 类似,Target Learning 致力于 挑选外卖更"感兴趣"的数据,即人为为更重要的数据添加 bias.例如我们当前 ...
- LoadRunner11脚本小技能之同步/异步接口分离+批量替换请求头
最近在公司又进行了一次LoadRunner11性能测试,技能又get了一点,继续Mark起来!!! 一.异步/同步接口分离 之前在另一篇博文中有提到"事务拆分"的小节,即一个htm ...
- 【网络】博客网站搭建之Typecho(命令版)
目录 前言 个人博客系统筛选 内网穿透 安装nginx 安装PHP 安装mysql Typecho 环境安装 参考 安装typecho Nginx与PHP进行连接配置&指定博客路径 验证 配置 ...
- nginx的域名重写和转发案例
对url进行重写 location = /tongyong_OTA_1.0.3.bin { rewrite ^(.*)$ http://36.133.87.223/lecode-server/leco ...
- Java—猜数字
package cn.day03.demo01; import java.util.Random; import java.util.Scanner; public class RandomGame ...
- win7修改开机动画
开机动画的修改 首先win7的过场动画是存在于C:\Windows\System32\bootres.dll ,而修改过程动画就需要修改这个dll,我不会改,所以只能用工具美化大师,软媒魔方里面的一个 ...
- linux mint 归档管理器报错Extraction not performd
解决办法 后缀名的问题,后缀名与文件的真正类型不符合,至于到底是上面压缩类型,那只能靠尝试了,比如我这个是rar, 实际是zip,很坑,网上也没有这个问题的描述 其他 感觉 linux 对于文件类型方 ...
- Jmeter启动报错: ANOMALY: use of REX.w is meaningless (default operand size is 64), Unrecognized option: --add-opens
摘要:需要远程到其他电脑,把本机的jmeter打包发到远程的电脑上,启动jmeter时报错如下: 原因分析:第一反应无法创建java虚拟机我以为是没有JDK,通过CMD Java -version ...