Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
一梦清浅…
leetcode
提交
47817b2e
L
leetcode
项目概览
一梦清浅…
/
leetcode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
leetcode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
47817b2e
编写于
3月 13, 2019
作者:
L
liu13
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
20190313
上级
051dfbf2
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
117 addition
and
10 deletion
+117
-10
code/lc121.java
code/lc121.java
+5
-8
code/lc122.java
code/lc122.java
+1
-1
code/lc123.java
code/lc123.java
+41
-0
code/lc188.java
code/lc188.java
+37
-0
code/lc309.java
code/lc309.java
+1
-1
code/lc714.java
code/lc714.java
+28
-0
readme.md
readme.md
+4
-0
未找到文件。
code/lc121.java
浏览文件 @
47817b2e
...
...
@@ -4,17 +4,14 @@ package code;
* 题意:股票买卖1次,最大利润
* 难度:Easy
* 分类:Arryas, Dynamic Programming
* Tips:lc12
2
* Tips:lc12
1, lc309, lc188, lc123, lc714
*/
public
class
lc121
{
public
int
maxProfit
(
int
[]
prices
)
{
int
min
=
prices
[
0
];
if
(
prices
.
length
==
0
)
return
0
;
int
res
=
0
;
for
(
int
i
=
1
;
i
<
prices
.
length
;
i
++)
{
res
=
Math
.
max
(
prices
[
i
]-
min
,
res
);
if
(
prices
[
i
]<
min
)
min
=
prices
[
i
];
int
min
=
Integer
.
MAX_VALUE
,
res
=
0
;
for
(
int
i
=
0
;
i
<
prices
.
length
;
i
++){
min
=
Math
.
min
(
min
,
prices
[
i
]);
res
=
Math
.
max
(
res
,
prices
[
i
]-
min
);
}
return
res
;
}
...
...
code/lc122.java
浏览文件 @
47817b2e
...
...
@@ -5,7 +5,7 @@ package code;
* 难度:Easy
* 分类:Array, Greedy
* 思路:计算 prices[i] 与 prices[i-1] 的差值,把正数全加起来就行了
* Tips:lc121, lc309
* Tips:lc121, lc309
, lc188, lc123, lc714
*/
public
class
lc122
{
public
int
maxProfit
(
int
[]
prices
)
{
...
...
code/lc123.java
0 → 100644
浏览文件 @
47817b2e
package
code
;
/*
* 122. Best Time to Buy and Sell Stock III
* 题意:买卖股票最大利润,只能买卖2次
* 难度:Hard
* 分类:Array, Dynamic Programming
* 思路:两种思路,第一种是分成两块,每块按lc121的算法进行计算,最后合并结果
* 第二种思路设置4个变量,分别为第一次买,第一次卖,第二次买,第二次卖的价格
* Tips:只想到了O(N^2)的方法
* lc121, lc309, lc188, lc123, lc714
*/
public
class
lc123
{
public
int
maxProfit
(
int
[]
prices
)
{
int
buy1
=
Integer
.
MAX_VALUE
,
buy2
=
Integer
.
MAX_VALUE
,
sell1
=
0
,
sell2
=
0
;
for
(
int
i
=
0
;
i
<
prices
.
length
;
i
++)
{
buy1
=
Math
.
min
(
buy1
,
prices
[
i
]);
//第一次购买的最低价格
sell1
=
Math
.
max
(
sell1
,
prices
[
i
]
-
buy1
);
buy2
=
Math
.
min
(
buy2
,
prices
[
i
]-
sell1
);
//记住第二项 prices[i]-sell1
sell2
=
Math
.
max
(
sell2
,
prices
[
i
]-
buy2
);
//当只购买一次时,会传递的
}
return
sell2
;
}
public
int
maxProfit2
(
int
[]
prices
)
{
//常规方法,分为两块,O(N^2)
int
res
=
0
;
for
(
int
i
=
0
;
i
<
prices
.
length
;
i
++)
{
int
res1
=
Math
.
max
(
0
,
helper
(
prices
,
0
,
i
));
int
res2
=
Math
.
max
(
0
,
helper
(
prices
,
i
,
prices
.
length
));
res
=
Math
.
max
(
res
,
res1
+
res2
);
}
return
res
;
}
public
int
helper
(
int
[]
prices
,
int
begin
,
int
end
)
{
int
min
=
Integer
.
MAX_VALUE
,
res
=
0
;
for
(
int
i
=
begin
;
i
<
end
;
i
++){
min
=
Math
.
min
(
min
,
prices
[
i
]);
res
=
Math
.
max
(
res
,
prices
[
i
]-
min
);
}
return
res
;
}
}
code/lc188.java
0 → 100644
浏览文件 @
47817b2e
package
code
;
/*
* 188. Best Time to Buy and Sell Stock IV
* 题意:买卖股票最大利润,可以买卖k次
* 难度:Hard
* 分类:Dynamic Programming
* 思路:二维dp, dp[i][j] 表示i次交易,在数组prices[0~j]上的最大利润
* dp[i][j] = Max( dp[i][j-1], dp[i-1][jj]+prices[j]-prices[jj] ) { jj in range of [0, j-1] }
* = Max( dp[i][j-1], prices[j]+ max(dp[i-1][jj]-prices[jj]) ) 转化为这一步,少了一层循环
* dp[0][j] = 0; dp[i][0] = 0;
* Tips:lc121, lc309, lc188, lc123, lc714
*/
public
class
lc188
{
public
int
maxProfit
(
int
k
,
int
[]
prices
)
{
if
(
prices
.
length
==
0
)
return
0
;
int
n
=
prices
.
length
;
//if k >= n/2, then you can make maximum number of transactions.
if
(
k
>=
n
/
2
)
{
int
maxPro
=
0
;
for
(
int
i
=
1
;
i
<
n
;
i
++)
{
if
(
prices
[
i
]
>
prices
[
i
-
1
])
maxPro
+=
prices
[
i
]
-
prices
[
i
-
1
];
}
return
maxPro
;
}
int
[][]
dp
=
new
int
[
k
+
1
][
prices
.
length
];
for
(
int
i
=
1
;
i
<=
k
;
i
++)
{
int
localMax
=
-
prices
[
0
];
for
(
int
j
=
1
;
j
<
prices
.
length
;
j
++)
{
//jj的计算和这一维合并,总的复杂度是二次方而不是三次
dp
[
i
][
j
]
=
Math
.
max
(
dp
[
i
][
j
-
1
],
prices
[
j
]+
localMax
);
localMax
=
Math
.
max
(
localMax
,
dp
[
i
-
1
][
j
]-
prices
[
j
]);
}
}
return
dp
[
k
][
prices
.
length
-
1
];
}
}
code/lc309.java
浏览文件 @
47817b2e
...
...
@@ -9,7 +9,7 @@ package code;
* sell[i] = max( sell[i-1], buy[i-1]+price[i] )
* 空间压缩以后时间是O(n),空间是O(1)
* Tips:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/discuss/75931/Easiest-JAVA-solution-with-explanations
*
lc122
*
lc121, lc309, lc188, lc123, lc714
*/
public
class
lc309
{
public
int
maxProfit
(
int
[]
prices
)
{
...
...
code/lc714.java
0 → 100644
浏览文件 @
47817b2e
package
code
;
/*
* 714. Best Time to Buy and Sell Stock with Transaction Fee
* 题意:买卖股票,不限次数,但有交易费用,求最大利润
* 难度:Medium
* 分类:Array, Dynamic Programming, Greedy
* 思路:和309思路一致,每次卖出的时候减去交易费用
* buy[i] = max( buy[i-1], sell[i-1]-price[i] )
* sell[i] = max( sell[i-1], buy[i-1]+price[i]-2 )
* Tips:
* 总结一下买卖股票的问题 交易1次,2次,任意多次都可在O(N)完成交易
* 交易k次时,时间复杂度为O(NM),M为交易次数
* 冷却时间和交易费用的解法一致,都是分买和卖两个状态,进行dp
*/
public
class
lc714
{
public
int
maxProfit
(
int
[]
prices
,
int
fee
)
{
if
(
prices
.
length
==
0
)
return
0
;
int
b1
=
-
prices
[
0
];
int
s1
=
0
,
b
=
0
,
s
=
0
;
for
(
int
i
=
0
;
i
<
prices
.
length
;
i
++)
{
b
=
Math
.
max
(
b1
,
s1
-
prices
[
i
]);
s
=
Math
.
max
(
s1
,
b1
+
prices
[
i
]-
fee
);
s1
=
s
;
b1
=
b
;
}
return
Math
.
max
(
s
,
b
);
}
}
readme.md
浏览文件 @
47817b2e
...
...
@@ -45,7 +45,9 @@ LeetCode 指南
| 021
[
Java
](
./code/lc21.java
)
| 022
[
Java
](
./code/lc22.java
)
| 023
[
Java
](
./code/lc23.java
)
| 024
[
Java
](
./code/lc24.java
)
| 026
[
Java
](
./code/lc26.java
)
| 027
[
Java
](
./code/lc27.java
)
| 028
[
Java
](
./code/lc28.java
)
| 029
[
Java
](
./code/lc29.java
)
| 031
[
Java
](
./code/lc31.java
)
...
...
@@ -96,6 +98,7 @@ LeetCode 指南
| 114
[
Java
](
./code/lc114.java
)
| 116
[
Java
](
./code/lc116.java
)
| 118
[
Java
](
./code/lc118.java
)
| 120
[
Java
](
./code/lc120.java
)
| 121
[
Java
](
./code/lc121.java
)
| 122
[
Java
](
./code/lc122.java
)
| 124
[
Java
](
./code/lc124.java
)
...
...
@@ -138,6 +141,7 @@ LeetCode 指南
| 208
[
Java
](
./code/lc208.java
)
| 210
[
Java
](
./code/lc210.java
)
| 212
[
Java
](
./code/lc212.java
)
| 213
[
Java
](
./code/lc213.java
)
| 215
[
Java
](
./code/lc215.java
)
| 217
[
Java
](
./code/lc217.java
)
| 218
[
Java
](
./code/lc215.java
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录