题目

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 步到达某一位置的方法数目的更多相关文章

  1. 【力扣leetcode】-787. K站中转内最便宜的航班

    题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...

  2. 力扣 - 560. 和为K的子数组

    目录 题目 思路1(前缀和) 代码 复杂度分析 思路2(前缀和+哈希表优化) 代码 复杂度分析 题目 560. 和为K的子数组 思路1(前缀和) 构建前缀和数组,可以快速计算任意区间的和 注意:计算区 ...

  3. 力扣Leetcode 55. 跳跃游戏

    跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...

  4. 力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现

    题目描述: 中文: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序 ...

  5. 刷题-力扣-230. 二叉搜索树中第K小的元素

    230. 二叉搜索树中第K小的元素 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a ...

  6. 刷题-力扣-1738. 找出第 K 大的异或坐标值

    1738. 找出第 K 大的异或坐标值 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-kth-largest-xor-co ...

  7. 力扣 - 剑指 Offer 22. 链表中倒数第k个节点

    题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...

  8. 【力扣】973. 最接近原点的 K 个点

    我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...

  9. 【力扣】有序矩阵中第K小的元素

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素.请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 示例: matrix = [ [ 1, 5, ...

  10. 力扣992.K个不同整数的子数组-C语言实现

    题目 原题链接 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续.不一定独立的子数组为好子数组. (例如,[1,2,3,1,2] 中有 3 个不同的整数: ...

随机推荐

  1. Python 多重继承时metaclass conflict问题解决与原理探究

    背景 最近有一个需求需要自定义一个多继承abc.ABC与django.contrib.admin.ModelAdmin两个父类的抽象子类,方便不同模块复用大部分代码,同时强制必须实现所有抽象方法,没想 ...

  2. Java多线程(6):锁与AQS(下)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现.既然它这么优秀,是骡子是马,就拉出来溜溜吧. 首先用重入锁来实现简单的累加,就像这 ...

  3. iOS- 最全的真机测试教程

      想要上架的同学请看:<iOS-最全的App上架教程> 因为最近更新了Xcode 8 ,证书的创建都大同小异,只是在Xcode 8中的设置有一些变化,我就在下面补充,如有什么疑问,请联系 ...

  4. .NET Conf 2022 &ndash; 11 月 8 日至 10 日

    .NET Conf 2022 下周就正式开启了,时间是美国时间的 11月8日至10日..NET Conf 2022是一个免费的,为期三天的, 虚拟开发人员活动提供多种实时会话,其中包括来自社区和 .N ...

  5. 用Nodejs 实现一个简单的 Redis客户端

    目录 0. 写在前面 1. 背景映入 2. 数据库选择 3. Nodejs TCP连接 3. 代码编写 4. 实验 5. wireshark 抓包分析 6. 杂与代码 0. 写在前面 大家如果有去看过 ...

  6. Karmada大规模测试报告发布:突破100倍集群规模

    摘要:在本文中,我们将介绍用于测试的相关指标,如何进行大规模测试,以及我们如何实现大规模的集群接入. 本文分享自华为云社区<突破100倍集群规模!Karmada大规模测试报告发布>,作者: ...

  7. jQuery漏洞复现整理

    jQuery DOM-based XSS 免责声明: 本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无 ...

  8. Web安全Day1 - SQL注入、漏洞类型

    Web安全Day1 - SQL注入.漏洞类型 1. SQL注入 1.1 漏洞简介 1.2 漏洞原理 1.3 漏洞危害 2. SQL漏洞类型 2.1 区分数字和字符串 2.2 内联SQL注入 2.3 报 ...

  9. 基于python的数学建模---多模糊评价

    权重 ak的确定--频数统计法 选取正整数p的方法 画箱形图   取1/4与3/4的距离(IQR)  ceil()取整 代码: import numpy as np def frequency(mat ...

  10. 自学 TypeScript 第四天,手把手项目搭建

    前言: 学了三天,我们学习了 TS 的基本类型声明,TS 的编译,webpack 打包,其实也就差不多了,剩下的也就一些 类,继承,构造函数,抽象类,泛型一些的,如果都细致的讲可能写好久,感兴趣的可以 ...