Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
一梦清浅…
leetcode
提交
cd5790db
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 搜索 >>
提交
cd5790db
编写于
1月 16, 2019
作者:
L
liu13
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
20190116
上级
a5a28faa
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
166 addition
and
5 deletion
+166
-5
code/lc121.java
code/lc121.java
+1
-0
code/lc122.java
code/lc122.java
+20
-0
code/lc287.java
code/lc287.java
+41
-0
code/lc300.java
code/lc300.java
+50
-0
code/lc309.java
code/lc309.java
+29
-0
code/lc312.java
code/lc312.java
+24
-4
code/lc437.java
code/lc437.java
+1
-1
未找到文件。
code/lc121.java
浏览文件 @
cd5790db
...
...
@@ -4,6 +4,7 @@ package code;
* 题意:股票买卖1次,最大利润
* 难度:Easy
* 分类:Arryas, Dynamic Programming
* Tips:lc122
*/
public
class
lc121
{
public
int
maxProfit
(
int
[]
prices
)
{
...
...
code/lc122.java
0 → 100644
浏览文件 @
cd5790db
package
code
;
/*
* 122. Best Time to Buy and Sell Stock II
* 题意:买卖股票最大利润,可以买多次
* 难度:Easy
* 分类:Array, Greedy
* 思路:计算 prices[i] 与 prices[i-1] 的差值,把正数全加起来就行了
* Tips:lc121, lc309
*/
public
class
lc122
{
public
int
maxProfit
(
int
[]
prices
)
{
if
(
prices
.
length
<
1
)
return
0
;
int
res
=
0
;
for
(
int
i
=
1
;
i
<
prices
.
length
;
i
++)
{
if
(
prices
[
i
]-
prices
[
i
-
1
]>
0
)
res
+=
prices
[
i
]-
prices
[
i
-
1
];
}
return
res
;
}
}
code/lc287.java
0 → 100644
浏览文件 @
cd5790db
package
code
;
/*
* 287. Find the Duplicate Number
* 题意:n+1个数属于[1~n],找出重复的那个数
* 难度:Medium
* 分类:Array, Two Pointers, Binary Search
* 思路:如果nums[i]不在对应位置,则和对应位置交换。如果对应位置上也为该数,说明这个数就是重复的数字。这个方法改变了数组。是错误的。
* 另一种方法,把问题转换成有环链表,找环的起始节点。O(n) O(1) lc142
* 二分查找,每次看一边数字的个数, O(nlog(n)) O(1)
* Tips:剑指offer原题
*/
public
class
lc287
{
public
int
findDuplicate
(
int
[]
nums
)
{
//该方法修改了数组,是错误的,没看清题意
for
(
int
i
=
0
;
i
<
nums
.
length
;
i
++)
{
if
(
nums
[
i
]!=
i
+
1
){
int
temp
=
nums
[
nums
[
i
]-
1
];
if
(
temp
==
nums
[
i
])
return
temp
;
nums
[
nums
[
i
]-
1
]
=
nums
[
i
];
nums
[
i
]
=
temp
;
i
--;
}
}
return
-
1
;
}
public
int
findDuplicate2
(
int
[]
nums
)
{
int
slow
=
nums
[
0
];
int
fast
=
nums
[
nums
[
0
]];
while
(
slow
!=
fast
){
slow
=
nums
[
slow
];
fast
=
nums
[
nums
[
fast
]];
}
fast
=
0
;
// fast是0,不是nums[0]
while
(
slow
!=
fast
){
slow
=
nums
[
slow
];
fast
=
nums
[
fast
];
}
return
slow
;
}
}
code/lc300.java
0 → 100644
浏览文件 @
cd5790db
package
code
;
/*
* 300. Longest Increasing Subsequence
* 题意:最长递增子数组,不一定是连续的
* 难度:Medium
* 分类:Binary Search, Dynamic Programming
* 思路:基本的思路是dp[i]记录以nums[i]结尾的最长长度,每次遍历 dp[i] 得到dp[i+1],复杂度为O(n^2)。最优的解法是O(nlgn),dp[i]是递增的数组,每次插入时二分查找是lgn。
* Tips:经典题目,记一下
*/
import
java.util.Arrays
;
public
class
lc300
{
public
int
lengthOfLIS
(
int
[]
nums
)
{
if
(
nums
.
length
<
2
)
return
nums
.
length
;
int
[]
dp
=
new
int
[
nums
.
length
];
//dp[i] 存储以nums[i]结尾的最大长度
Arrays
.
fill
(
dp
,
1
);
int
res
=
1
;
for
(
int
i
=
1
;
i
<
nums
.
length
;
i
++)
{
for
(
int
j
=
0
;
j
<
i
;
j
++)
{
if
(
nums
[
i
]>
nums
[
j
]){
dp
[
i
]
=
Math
.
max
(
dp
[
j
]+
1
,
dp
[
i
]);
}
}
res
=
Math
.
max
(
res
,
dp
[
i
]);
}
return
res
;
}
public
int
lengthOfLIS2
(
int
[]
nums
)
{
if
(
nums
.
length
<
2
)
return
nums
.
length
;
int
size
=
0
;
//size指dp中递增的长度。 dp[0~i] 表示了长度为 i+1 的递增子数组,且最后一个值是最小值
int
[]
dp
=
new
int
[
nums
.
length
];
//dp存储递增的数组,之后更新这个数组。如果x>最后一个值,则插入到末尾,否则更新对应位置上的值为该值。
for
(
int
i
=
0
;
i
<
nums
.
length
;
i
++)
{
int
left
=
0
;
int
right
=
size
;
while
(
left
!=
right
){
//得到要插入的位置
int
mid
=
(
left
+
right
)/
2
;
if
(
dp
[
mid
]<
nums
[
i
])
left
=
mid
+
1
;
else
right
=
mid
;
}
dp
[
left
]
=
nums
[
i
];
if
(
left
==
size
)
size
++;
}
return
size
;
}
}
code/lc309.java
0 → 100644
浏览文件 @
cd5790db
package
code
;
/*
* 309. Best Time to Buy and Sell Stock with Cooldown
* 题意:最佳时间买卖股票,有冷却期,如果前一天卖了,下一天就不能买
* 难度:Medium
* 分类:Dynamic Programming
* 思路:状态DP,自己不会写。要分两种状态,手中有股票时最大收益,手中没股票时最大收益(包括冷冻期)。
* buy[i] = max( buy[i-1], sell[i-2]-price[i] )
* 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
*/
public
class
lc309
{
public
int
maxProfit
(
int
[]
prices
)
{
if
(
prices
.
length
==
0
)
return
0
;
int
b1
=
-
prices
[
0
];
int
s2
=
0
,
s1
=
0
;
int
b
=
0
,
s
=
0
;
for
(
int
i
=
0
;
i
<
prices
.
length
;
i
++)
{
b
=
Math
.
max
(
b1
,
s2
-
prices
[
i
]);
s
=
Math
.
max
(
s1
,
b1
+
prices
[
i
]);
s2
=
s1
;
s1
=
s
;
b1
=
b
;
}
return
Math
.
max
(
s
,
b
);
}
}
code/lc312.java
浏览文件 @
cd5790db
...
...
@@ -5,19 +5,20 @@ package code;
* 难度:Hard
* 分类:Divide and Conquer, Dynamic Programming
* 思路:假设第n个气球是最后一个被踩爆,则从第n个气球开始,数组可以分为无前后相关性的两块
* Tips:太难了,弃疗了,不会写。直接粘答案。
* 首尾补1,最小区间为3个数,maxCoins[1,4],则需遍历2,3两种情况, 1,4指的是边界
* maxCoins[0][n - 1] = maxCoins[0][i - 1] + maxCoins[i + 1][n - 1] + nums[left] * nums[i] * nums[right]
* left是左边界,right是右边界,不一定是相邻的
* Tips:太难了,弃疗了,不会写。直接粘答案。区间dp。
*/
public
class
lc312
{
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
maxCoins
(
new
int
[]{
3
,
1
,
5
,
8
}));
System
.
out
.
println
(
maxCoins
2
(
new
int
[]{
3
,
1
,
5
,
8
}));
}
public
static
int
maxCoins
(
int
[]
iNums
)
{
int
[]
nums
=
new
int
[
iNums
.
length
+
2
];
int
n
=
1
;
for
(
int
x
:
iNums
)
if
(
x
>
0
)
nums
[
n
++]
=
x
;
nums
[
0
]
=
nums
[
n
++]
=
1
;
int
[][]
memo
=
new
int
[
n
][
n
];
int
res
=
burst
(
memo
,
nums
,
0
,
n
-
1
);
return
res
;
...
...
@@ -34,4 +35,23 @@ public class lc312 {
return
ans
;
}
public
static
int
maxCoins2
(
int
[]
iNums
)
{
int
[]
nums
=
new
int
[
iNums
.
length
+
2
];
int
n
=
1
;
for
(
int
x
:
iNums
)
if
(
x
>
0
)
nums
[
n
++]
=
x
;
nums
[
0
]
=
nums
[
n
++]
=
1
;
int
[][]
dp
=
new
int
[
n
][
n
];
for
(
int
k
=
2
;
k
<
n
;
++
k
)
for
(
int
left
=
0
;
left
<
n
-
k
;
++
left
)
{
int
right
=
left
+
k
;
for
(
int
i
=
left
+
1
;
i
<
right
;
++
i
)
dp
[
left
][
right
]
=
Math
.
max
(
dp
[
left
][
right
],
nums
[
left
]
*
nums
[
i
]
*
nums
[
right
]
+
dp
[
left
][
i
]
+
dp
[
i
][
right
]);
}
return
dp
[
0
][
n
-
1
];
}
}
code/lc437.java
浏览文件 @
cd5790db
...
...
@@ -51,7 +51,7 @@ public class lc437 {
if
(
root
==
null
)
return
0
;
if
(
root
.
val
==
sum
)
return
1
+
dfs
(
root
.
left
,
sum
-
root
.
val
)
+
dfs
(
root
.
right
,
sum
-
root
.
val
);
return
1
+
dfs
(
root
.
left
,
sum
-
root
.
val
)
+
dfs
(
root
.
right
,
sum
-
root
.
val
);
//不要直接返回1,因为可能后边节点,或节点和为0
return
dfs
(
root
.
left
,
sum
-
root
.
val
)
+
dfs
(
root
.
right
,
sum
-
root
.
val
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录