Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_36480062
Algorithm
提交
2f99266f
A
Algorithm
项目概览
qq_36480062
/
Algorithm
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
Algorithm
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2f99266f
编写于
2月 20, 2020
作者:
qq_36480062
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
commit
上级
6d77c48c
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
132 addition
and
2 deletion
+132
-2
algorithm/Math/斐波拉切数列详解.java
algorithm/Math/斐波拉切数列详解.java
+7
-0
algorithm/Math/汉诺塔.java
algorithm/Math/汉诺塔.java
+41
-0
algorithm/Math/矩阵快速幂.java
algorithm/Math/矩阵快速幂.java
+1
-2
algorithm/dp/上楼梯.java
algorithm/dp/上楼梯.java
+83
-0
未找到文件。
algorithm/Math/斐波拉切数列详解.java
0 → 100644
浏览文件 @
2f99266f
package
Math
;
public
class
斐波拉切数列详解
{
public
static
void
main
(
String
[]
args
)
{
}
}
algorithm/Math/汉诺塔.java
0 → 100644
浏览文件 @
2f99266f
package
Math
;
/**
* 当有n个盘子在A上,先把n-1个盘子放在C盘子上,再把最大的盘子放在B上
* 再把那n-1个盘子放回B上面
* 即:f(n)=2f(n-1)+1
* 盘子数量 移动次数
* 1 1
* 2 3
* 3 3*2+1
* <p>
* 不难得出数学通项公式为,f(n)=2^(n-1)
* 推导过程:f(n-1)=(2^n-1)-1 提出假设
* 则代入递推式可得:f(n)=2((2^n-1)-1)+1=2^n-2+1=2^n-1
*/
public
class
汉诺塔
{
public
static
void
main
(
String
[]
args
)
{
}
public
static
long
han
(
int
n
)
{
long
[]
dp
=
new
long
[
n
];
dp
[
0
]
=
1
;
for
(
int
i
=
1
;
i
<
n
;
i
++)
{
dp
[
i
]
=
dp
[
i
-
1
]
*
2
+
1
;
}
return
dp
[
n
-
1
];
}
public
static
long
haNN
(
int
n
)
{
return
(
long
)
(
Math
.
pow
(
2
,
n
)
-
1
);
}
public
static
void
Test
()
{
for
(
int
i
=
1
;
i
<
32
;
i
++)
{
if
(
han
(
i
)
!=
haNN
(
i
))
{
System
.
out
.
println
(
i
);
}
}
}
}
algorithm/Math/矩阵快速幂.java
浏览文件 @
2f99266f
...
...
@@ -94,7 +94,7 @@ public class 矩阵快速幂 {
* 使用矩阵快速幂求,斐波拉切数列第n项
*
* @param n 斐波拉切数列第n项
* @return 使用矩阵快速幂求,斐波拉切数列第n项
* @return 使用矩阵快速幂求,
斐波拉切数列第n项
*/
public
static
long
fib
(
int
n
)
{
long
[][]
c
=
{{
0
,
1
},
{
1
,
1
}};
//f(n)=f(n-1)+f(n-2)
...
...
@@ -103,5 +103,4 @@ public class 矩阵快速幂 {
return
res
[
0
][
0
];
}
}
algorithm/dp/上楼梯.java
0 → 100644
浏览文件 @
2f99266f
package
dp
;
/**
* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
* 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
* 注意:给定 n 是一个正整数。
* 给出1-5阶楼梯的走法
* 5 4 3 2 1
* <p>
* 1 1 1 1 1 1 1 1 1 1 1 1 1
* 1 2 1 1 1 2 1 1 1
* 1 1 2 1 1 1 2 1 2
* 1 1 1 2 2 1 1 2 1
* 1 2 2 2 2 2
* 2 2 1
* 2 1 2
* 2 1 1 1
* <p>
* 对比1和2,来推导3
* 3 2 1
* 1 1 1 1(+2)
* 1 1(+1)
* 1 2
* 2 1 2(+1)
* <p>
* 对比2和3,来推导4,需要再走两步或者一步
* 4 3 2
* 1 1 1 1 1 1 1(+1)
* 1 2 1 1 1(+2)
* 1 1 2 1 2(+1)
* 2 1 1 2 1(+1)
* 2 2 2(+2)
* <p>
* 对应起来:可知dp[i] = dp[i - 1] + dp[i - 2]
* dp[i]语义就是走i阶楼梯能有多少种选择
* <p>
* 大白话:把已知的数据存在数组里,作为基本条件,然后再根据数组语义找出dp方程,
* 也就是前面得到的答案可以推出后面的答案
*/
public
class
上楼梯
{
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
dpp
(
4
));
System
.
out
.
println
(
dp
(
4
));
}
/**
* f(n)=f(n-1)+f(n-2)
*
* @param n
* @return
*/
public
static
int
dpp
(
int
n
)
{
int
[]
dp
=
new
int
[
n
];
dp
[
0
]
=
1
;
dp
[
1
]
=
2
;
for
(
int
i
=
2
;
i
<
n
;
i
++)
{
dp
[
i
]
=
dp
[
i
-
1
]
+
dp
[
i
-
2
];
}
return
dp
[
n
-
1
];
}
/**
* 变态上楼梯,无论多少阶楼梯,都可以一步跨上去
* 楼梯阶数 方法数量
* 1 1
* 2 2
* 3 4
* 4 8
* 5 1+2+4+8+1=16
* 则:f(n)=n-1∑i=1 f(i)+1
* 假设n阶楼梯数学通项公式为:f(n)=2^(n-1)
* 则f(n-1)=2^(n-2)
* 代入递推式 f(n)=n-1∑i=1 f(i)+1 =1+2+4+2^(n-2)+1
* =2^(n-1)-1+1=2^(n-1)
* 几何级数
*
* @param n
* @return
*/
public
static
int
dp
(
int
n
)
{
return
(
int
)
Math
.
pow
(
2
,
n
-
1
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录