- 设计思想:
详细操作流程看下图:
-视频讲解链接B站视频讲解
- 复杂度分析:
- 代码:
c++版本:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @param m int整型
* @param a int整型vector
* @return int整型
*/
int solve(int n, int m, vector<int>& a) {
// write code here
//dp[i]代表跳到第i级台阶的方法数
/*
如果台阶i有水不能跳 dp[i] = 0;
他可以跳奇数层台阶,所以对于i为奇数的时候,它一定是从i为偶数的地方跳过来
dp[奇数] = Sum(dp[偶数])
对于i为偶数的时候,它一定是从i为奇数的地方跳过来
*/
int mod = 1e9 + 7;
int cnt = 0;//用于遍历数组a
vector<int> dp(n + 1, 0); //dp[i]表示i级台阶方法数
dp[0] = 1;
int odd = 0;//i为奇数的时候dp[i]的总和
int even = 1;//i为偶数的时候dp[i]的总和,对于i=2他只能有一种跳格子方案
for(int i = 1;i <= n;i ++){
if(cnt<m && i == a[cnt]){
cnt ++;
}else{
if(i % 2 == 0){
dp[i] = odd % mod;
even = (even+dp[i])%mod;
}else{
dp[i] = even % mod;
odd = (odd + dp[i])%mod;
}
}
}
return dp[n];
}
};Java版本:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @param m int整型
* @param a int整型一维数组
* @return int整型
*/
public int solve (int n, int m, int[] a) {
// write code here
int mod = (int)1e9 + 7;
int cnt = 0;//用于遍历数组a
int[] dp=new int[n+1];//dp[i]表示i级台阶方法数
dp[0] = 1;
int odd = 0;//i为奇数的时候dp[i]的总和
int even = 1;//i为偶数的时候dp[i]的总和,对于i=2他只能有一种跳格子方案
for(int i = 1;i <= n;i ++){
if(cnt < m && i == a[cnt]){
cnt ++;
}else{
if(i % 2 == 0){
dp[i] = odd % mod;
even = (even+dp[i])%mod;
}else{
dp[i] = even % mod;
odd = (odd + dp[i])%mod;
}
}
}
return dp[n];
}
}Python版本:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param n int整型
# @param m int整型
# @param a int整型一维数组
# @return int整型
#
class Solution:
def solve(self , n , m , a ):
# write code here
mod = 10 ** 9 + 7
cnt = 0#用于遍历数组a
dp = [0] * (n + 1)#dp[i]表示i级台阶方法数
dp[0] = 1;
odd = 0#i为奇数的时候dp[i]的总和
even = 1#i为偶数的时候dp[i]的总和,对于i=2他只能有一种跳格子方案
for i in range(1,n+1):
if cnt < m and i == a[cnt]:
cnt += 1
else:
if i % 2 == 0:
dp[i] = odd % mod;
even = (even+dp[i])%mod;
else:
dp[i] = even % mod;
odd = (odd + dp[i])%mod;
return dp[n]JavaScript版本:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @param m int整型
* @param a int整型一维数组
* @return int整型
*/
function solve( n , m , a ) {
// write code here
let mod = 1e9 + 7;
let cnt = 0;//用于遍历数组a
let dp = [0];//dp[i]表示i级台阶方法数
dp[0] = 1;
let odd = 0;//i为奇数的时候dp[i]的总和
let even = 1;//i为偶数的时候dp[i]的总和,对于i=2他只能有一种跳格子方案
for(let i = 1;i <= n;i ++){
dp[i] = 0;
if(cnt < m && i == a[cnt]){
cnt ++;
}else{
if(i % 2 == 0){
dp[i] = odd % mod;
even = (even+dp[i])%mod;
}else{
dp[i] = even % mod;
odd = (odd + dp[i])%mod;
}
}
}
return dp[n];
}
module.exports = {
solve : solve
};
京公网安备 11010502036488号