Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
NoComments
leetcode
提交
ad113df9
L
leetcode
项目概览
NoComments
/
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 搜索 >>
提交
ad113df9
编写于
1月 14, 2019
作者:
L
liu13
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
20190114
上级
09371dff
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
150 addition
and
0 deletion
+150
-0
code/lc301.java
code/lc301.java
+48
-0
code/lc437.java
code/lc437.java
+77
-0
code/lc560.java
code/lc560.java
+25
-0
未找到文件。
code/lc301.java
0 → 100644
浏览文件 @
ad113df9
package
code
;
/*
* 301. Remove Invalid Parentheses
* 题意:删掉不匹配的括号
* 难度:Hard
* 分类:Depth-first Search, Breadth-first Search
* 思路:先计数),如果多的话,在前边的字符里删掉一个。反转字符串,计数(
* Tips:好难啊,里边很多细节需要注意。还有一种bfs的思路,挨个删字符,判断是否合规。
*/
import
java.util.ArrayList
;
import
java.util.HashSet
;
import
java.util.List
;
public
class
lc301
{
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
removeInvalidParentheses
(
"()())()"
).
toString
());
}
public
static
List
<
String
>
removeInvalidParentheses
(
String
s
)
{
HashSet
<
String
>
res
=
new
HashSet
();
StringBuilder
sb
=
new
StringBuilder
();
helper
(
s
,
res
,
0
,
0
,
new
char
[]{
'('
,
')'
});
return
new
ArrayList
<>(
res
);
}
public
static
void
helper
(
String
s
,
HashSet
<
String
>
res
,
int
pos
,
int
pos2
,
char
[]
chs
){
int
count
=
0
;
char
[]
str_arr
=
s
.
toCharArray
();
for
(
int
i
=
pos
;
i
<
s
.
length
()
;
i
++)
{
if
(
str_arr
[
i
]==
chs
[
0
]
)
count
++;
else
if
(
str_arr
[
i
]==
chs
[
1
]
)
count
--;
if
(
count
<
0
)
{
//需要删除一个 ')'
for
(
int
j
=
pos2
;
j
<=
i
;
j
++)
{
// pos2 避免重复的情况又算一次
if
(
str_arr
[
j
]
==
chs
[
1
]
&&
j
==
0
)
helper
(
s
.
substring
(
0
,
j
)+
s
.
substring
(
j
+
1
),
res
,
i
,
j
,
chs
);
if
(
str_arr
[
j
]
==
chs
[
1
]
&&
j
>
0
&&
str_arr
[
j
-
1
]
!=
chs
[
1
])
helper
(
s
.
substring
(
0
,
j
)+
s
.
substring
(
j
+
1
),
res
,
i
,
j
,
chs
);
//把截取后的s传到递归函数里, i不用+1,因为已经删掉一个字符了
}
return
;
}
}
s
=
new
StringBuilder
(
s
).
reverse
().
toString
();
if
(
chs
[
0
]==
'('
)
helper
(
s
,
res
,
0
,
0
,
new
char
[]{
')'
,
'('
});
//反转
else
res
.
add
(
s
);
}
}
code/lc437.java
0 → 100644
浏览文件 @
ad113df9
package
code
;
import
java.util.HashMap
;
/*
* 437. Path Sum III
* 题意:树中有几条节点和为sum的路径
* 难度:Easy
* 分类:Tree
* 思路:两种方法,一种类似数组中连续和为k的解法,hashmap. 另一种方法是递归
* Tips:自己写的自顶向下的 dfs 会出现重复情况,父节点算一次,父节点的父节点也调用它算了一次,注意这种情况。应对方法是写两个函数,在不同的地方调用。
* 递归的时候用减是否==0的方式,而不是+==sum的方式
* 和lc560有共同的思想,每个节点只需遍历一遍就可以了
* 虽然是Easy题,做好也不简单
*/
public
class
lc437
{
public
static
class
TreeNode
{
int
val
;
TreeNode
left
;
TreeNode
right
;
TreeNode
(
int
x
)
{
val
=
x
;
}
}
public
static
void
main
(
String
[]
args
)
{
TreeNode
node10
=
new
TreeNode
(
10
);
TreeNode
node5
=
new
TreeNode
(
5
);
TreeNode
node3
=
new
TreeNode
(
3
);
TreeNode
node2
=
new
TreeNode
(
2
);
TreeNode
node1
=
new
TreeNode
(
1
);
TreeNode
noden3
=
new
TreeNode
(-
3
);
TreeNode
node11
=
new
TreeNode
(
11
);
node10
.
left
=
node5
;
node10
.
right
=
noden3
;
node5
.
left
=
node3
;
node5
.
right
=
node2
;
node2
.
right
=
node1
;
noden3
.
right
=
node11
;
System
.
out
.
println
(
pathSum2
(
node10
,
8
));
}
public
static
int
pathSum
(
TreeNode
root
,
int
sum
)
{
//该节点作为起点
if
(
root
==
null
)
return
0
;
return
dfs
(
root
,
sum
)
+
pathSum
(
root
.
left
,
sum
)
+
pathSum
(
root
.
right
,
sum
);
}
public
static
int
dfs
(
TreeNode
root
,
int
sum
)
{
//一条路径向下走
if
(
root
==
null
)
return
0
;
if
(
root
.
val
==
sum
)
return
1
+
dfs
(
root
.
left
,
sum
-
root
.
val
)
+
dfs
(
root
.
right
,
sum
-
root
.
val
);
return
dfs
(
root
.
left
,
sum
-
root
.
val
)
+
dfs
(
root
.
right
,
sum
-
root
.
val
);
}
public
static
int
pathSum2
(
TreeNode
root
,
int
sum
)
{
//类似连续和为k的解法
if
(
root
==
null
)
return
0
;
HashMap
<
Integer
,
Integer
>
hs
=
new
HashMap
<>();
hs
.
put
(
0
,
1
);
return
helper
(
root
,
sum
,
hs
,
0
);
}
public
static
int
helper
(
TreeNode
root
,
int
sum
,
HashMap
<
Integer
,
Integer
>
hs
,
int
cur_sum
)
{
if
(
root
==
null
)
return
0
;
cur_sum
+=
root
.
val
;
int
res
=
hs
.
getOrDefault
(
cur_sum
-
sum
,
0
);
//该节点作为尾节点的解的个数
hs
.
put
(
cur_sum
,
hs
.
getOrDefault
(
cur_sum
,
0
)+
1
);
//注意与上一句顺序
res
+=
helper
(
root
.
left
,
sum
,
hs
,
cur_sum
);
//加上孩子节点的解
res
+=
helper
(
root
.
right
,
sum
,
hs
,
cur_sum
);
hs
.
put
(
cur_sum
,
hs
.
get
(
cur_sum
)-
1
);
return
res
;
}
}
code/lc560.java
0 → 100644
浏览文件 @
ad113df9
package
code
;
import
java.util.HashMap
;
/*
* 560. Subarray Sum Equals K
* 题意:子数组的和等于k的个数
* 难度:Medium
* 分类:Array, Hash Table
* 思路:求出累加和存在hashmap中,如果当前hashmap中存在sum-k,那么就是一个解
* Tips:经典思路,记一下。lc437有类似思想。
*/
public
class
lc560
{
public
int
subarraySum
(
int
[]
nums
,
int
k
)
{
HashMap
<
Integer
,
Integer
>
hs
=
new
HashMap
();
hs
.
put
(
0
,
1
);
int
res
=
0
;
for
(
int
sum
=
0
,
i
=
0
;
i
<
nums
.
length
;
i
++)
{
sum
+=
nums
[
i
];
res
+=
hs
.
getOrDefault
(
sum
-
k
,
0
);
// sum1+sum2 = k ,说明sum2-sum1那一段是一个解
hs
.
put
(
sum
,
hs
.
getOrDefault
(
sum
,
0
)+
1
);
}
return
res
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录