有一个长度为 arrLen 的数组,开始有一个指针在索引 0 处。

每一步操作中,你可以将指针向左或向右移动 1 步,或者停在原地(指针不能被移动到数组范围外)。

给你两个整数 steps 和 arrLen ,请你计算并返回:在恰好执行 steps 次操作以后,指针仍然指向索引 0 处的方案数。

由于答案可能会很大,请返回方案数 模 10^9 + 7 后的结果。

示例 1:

输入:steps = 3, arrLen = 2
输出:4
解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处。
向右,向左,不动
不动,向右,向左
向右,不动,向左
不动,不动,不动

示例 2:

输入:steps = 2, arrLen = 4
输出:2
解释:2 步后,总共有 2 种不同的方法可以停在索引 0 处。
向右,向左
不动,不动

示例 3:

输入:steps = 4, arrLen = 2 输出:8

提示:

1 <= steps <= 500
1 <= arrLen <= 10^6
通过次数2,589提交次数6,511

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-ways-to-stay-in-the-same-place-after-some-steps
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

拿到这个题想一下我就不信长度有106这么长,看到steps就知道了,最长也就是500,我们这时候可以考虑一下三种情况:steps>arrLen , steps<arrLen,steps = arrLen,我们要拿到的最佳状态也就是steps和arrLen中比较小的数当长度(如果arrLen <= steps没啥争议,arrLen=arrLen,反之他根本走不到steps+1这个位置)。先考虑下时间复杂度,上次因为这个错了四次,嘤嘤嘤。所以要用min(steps+1,arrLen)。

class Solution {public:int numWays(int steps, int arrLen) {long long  mod = 1000000007;arrLen = min(steps + 1, arrLen);long long  data[501][501];memset(data, 0, sizeof(data));//先把数组全部元素赋值0data[0][0] = 1;//[0,0]这个位置特殊是1for (int i = 1; i <=steps; ++i) {//一共操作这些步数for (int j = 0; j < arrLen; ++j) {data[i][j] += data[i - 1][j];//比如:执行2步的数量是原地不动+向左动+向左动,这里加上了原地不动的//向右动if (j > 0) data[i][j] += data[i - 1][j - 1];//j起码得是数组第二个值,要是第一个值,那左边就没有值了。//比如:i=3,j=2那么走三步在第二格的完全可以加上走二步在第一格的(你看看这个走一步就是了)if(j<arrLen-1)  data[i][j] += data[i - 1][j + 1];//向左动//这个j这时候起码在数组的倒数第二个值比如:i=3,j=2那么走三步在第二格的完全可以加上走两步在第三格的(你看看这个走一步就是了)data[i][j] %= mod;//题目要求的鸭}}return data[steps][0];//他要停在0处的就给他呗}
};

然后卑微报错,难过。
27
7
这个输进去不行,阿西吧,我改了好久都不行,最后看了Bubbly老哥(力扣id)的代码,改了一下。

class Solution {public:int numWays(int steps, int arrLen) {long long  data[501][501];long long  mod = 1e9+7;arrLen = min(steps + 1, arrLen);memset(data, 0, sizeof(data));//先把数组全部元素赋值0data[0][0] = 1;//[0,0]这个位置特殊是1for (int i = 1; i <=steps; ++i) {//一共操作这些步数for (int j = 0; j < arrLen; ++j) {data[i][j] += data[i - 1][j];//比如:执行2步的数量是原地不动+向左动+向左动,这里加上了原地不动的//向右动if (j > 0) data[i][j] += data[i - 1][j - 1];//j起码得是数组第二个值,要是第一个值,那左边就没有值了。//比如:i=3,j=2那么走三步在第二格的完全可以加上走二步在第一格的(你看看这个走一步就是了)if(j<arrLen-1)  data[i][j] += data[i - 1][j + 1];//向左动//这个j这时候起码在数组的倒数第二个值比如:i=3,j=2那么走三步在第二格的完全可以加上走两步在第三格的(你看看这个走一步就是了)data[i][j] %= mod;//题目要求的鸭}}return data[steps][0];//他要停在0处的就给他呗}
};

啊我自己设置的愚蠢的mode。
总结:这种问题(关于数组的计数)可以模拟一下,步数for在上面走多少步,然后步数对应的到达次数设计下就好啦。

C++算法学习(力扣:1269. 停在原地的方案数)相关推荐

  1. leetcode 1269. 停在原地的方案数(dp)

    示例 1: 输入:steps = 3, arrLen = 2 输出:4 解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处. 向右,向左,不动 不动,向右,向左 向右,不动,向左 不动,不动 ...

  2. C++算法学习(力扣:328. 奇偶链表)

    给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂度应为 O(1),时 ...

  3. C++算法学习(力扣:1091. 二进制矩阵中的最短路径)

    在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, -, C_k 组成: 相邻单 ...

  4. C++算法学习(力扣:面试题 16.04. 井字游戏)

    设计一个算法,判断玩家是否赢了井字游戏.输入是一个 N x N 的数组棋盘,由字符" ","X"和"O"组成,其中字符" &quo ...

  5. C++算法学习(力扣:201. 数字范围按位与)

    给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入: [5,7] 输出: 4 ...

  6. C++算法学习(力扣:134. 加油站)

    在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升.你从其中的一个加 ...

  7. C++算法学习(力扣:402. 移掉K位数字)

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示例 1 : 输入: nu ...

  8. C++算法学习(力扣:859. 亲密字符串)

    给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回 false . 交换字母的定义是取两个下标 i 和 j (下标 ...

  9. C++算法学习(力扣:1122. 数组的相对排序)

    给你两个数组,arr1 和 arr2, arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序 ...

最新文章

  1. 架构周报| 浅析MySQL JDBC连接配置上的两个误区
  2. Educational Codeforces Round 86 (Rated for Div. 2)c和d
  3. leetcode 106. 从中序与后序遍历序列构造二叉树 c语言递归解法
  4. php处理二进制,PHP应用:PHP处理二进制数据的实现方法
  5. 机器学习是如何运作的?谷歌来告诉你
  6. 一个略复杂的数据映射聚合例子及代码重构
  7. mybatis配置id自增mysql_mybatis配置oracle的主键自增长
  8. 树莓派3B+,我要跑.NET CORE
  9. 《那些年啊,那些事——一个程序员的奋斗史》——30
  10. 基于matlab的模糊PID控制仿真
  11. 【bzoj 3815】卡常数
  12. 计算机辅助制造相关的技术,什么是PCB制造中CAM或计算机辅助制造技术?
  13. Excel 转置分组时如何保留没有对应数据的空组
  14. 判断单双周java_单双周计算
  15. 阵列卡服务器装linux,Linux网卡阵列卡安装
  16. GIS空间分析之公路选线
  17. Oracle EBS 查找段限定词中账户类型SQL
  18. 他励直流电动机的制动
  19. 关闭英文拼写检查,关闭xml验证
  20. Python自动化:提取扫描件中的文字

热门文章

  1. 学习C语言中的位操作
  2. 证明$r(A^TA) = r(A)$
  3. Matlab之数据的输入与输出
  4. Tensorflow 中添加正则化项
  5. 2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)
  6. Silverlight:纠结的快捷键问题
  7. java分页 Struts+Ibatis
  8. Word怎么转换成PDF?
  9. 基于 Docker 中的 MongoDB 授权使用
  10. 用PHP玩百万英雄类型游戏!!!