Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit fd38e9e

Browse files
Merge pull request doocs#258 from HendSame/master
add solution 301(d),507(s),508(m),513(m)
2 parents ebda970 + 9369854 commit fd38e9e

File tree

4 files changed

+165
-0
lines changed

4 files changed

+165
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
class Solution {
2+
public List<String> removeInvalidParentheses(String s) {
3+
// 最终结果去重
4+
HashSet<String> set = new HashSet<>();
5+
// 先遍历一遍,比对,找出需要删除的"("和")"的个数
6+
// 当前处理字符的位置
7+
int index = 0;
8+
// 需要删除"("的个数
9+
int leftToDelete = 0;
10+
// 需要删除")"的个数
11+
int rightToDelete = 0;
12+
// 剩余几个"("没有匹配到")"
13+
int leftCount = 0;
14+
char[] chars = s.toCharArray();
15+
for (char c : chars) {
16+
switch (c) {
17+
case '(':
18+
leftToDelete++;
19+
break;
20+
case ')':
21+
if (leftToDelete > 0) {
22+
// 抵消
23+
leftToDelete--;
24+
} else {
25+
rightToDelete++;
26+
}
27+
break;
28+
default:
29+
}
30+
}
31+
dfs(s, index, leftCount, leftToDelete, rightToDelete, set, new StringBuilder());
32+
ArrayList<String> list = new ArrayList<>();
33+
list.addAll(set);
34+
return list;
35+
}
36+
37+
38+
private void dfs(String s, int index, int leftCount, int leftToDelete, int rightToDelete, HashSet<String> set, StringBuilder sb) {
39+
if (index == s.length()) {
40+
if (leftToDelete == 0 && rightToDelete == 0 && leftCount == 0) {
41+
set.add(sb.toString());
42+
}
43+
return;
44+
}
45+
char c = s.charAt(index);
46+
if (c == '(') {
47+
// 如果是'(',那么要么删除,要么保留.
48+
// 如果删除
49+
if (leftToDelete > 0) {
50+
StringBuilder tmp = new StringBuilder(sb);
51+
dfs(s, index + 1, leftCount, leftToDelete - 1, rightToDelete, set, tmp);
52+
}
53+
// 不删,或者没有可以删除的
54+
StringBuilder tmp = new StringBuilder(sb);
55+
tmp.append(c);
56+
dfs(s, index + 1, leftCount + 1, leftToDelete, rightToDelete, set, tmp);
57+
} else if (c == ')') {
58+
// 删除
59+
if (rightToDelete > 0) {
60+
StringBuilder tmp = new StringBuilder(sb);
61+
dfs(s, index + 1, leftCount, leftToDelete, rightToDelete - 1, set, tmp);
62+
}
63+
// 在前面有'('的时候保留.
64+
if (leftCount > 0) {
65+
StringBuilder tmp = new StringBuilder(sb);
66+
tmp.append(c);
67+
dfs(s, index + 1, leftCount - 1, leftToDelete, rightToDelete, set, tmp);
68+
} else {
69+
// ")"这个没有"("和他对应,结束
70+
return;
71+
}
72+
} else {
73+
// 其他字符
74+
StringBuilder tmp = new StringBuilder(sb);
75+
tmp.append(c);
76+
dfs(s, index + 1, leftCount, leftToDelete, rightToDelete, set, tmp);
77+
}
78+
}
79+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
public class Solution {
2+
public boolean checkPerfectNumber(int num) {
3+
if (num == 0 || num == 1) {
4+
return false;
5+
}
6+
int sum = 1;
7+
for (int i = 2; i <= Math.sqrt(num); i++) {
8+
if (num % i == 0) {
9+
sum = sum + i + num / i;
10+
}
11+
}
12+
return num == sum;
13+
}
14+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode(int x) { val = x; }
8+
* }
9+
*/
10+
public class Solution {
11+
// 后续遍历,遍历的同时,找最大值和计算次数
12+
Map<Integer, Integer> map = new HashMap<>();
13+
int max = Integer.MIN_VALUE;
14+
15+
public int[] findFrequentTreeSum(TreeNode root) {
16+
if (root == null) {
17+
return new int[0];
18+
}
19+
dfs(root);
20+
List<Integer> list = map.entrySet().stream()
21+
.filter(m -> m.getValue() == max).map(i -> i.getKey()).collect(Collectors.toList());
22+
int[] res = new int[list.size()];
23+
for (int i = 0; i < list.size(); i++) {
24+
res[i] = list.get(i);
25+
}
26+
return res;
27+
}
28+
29+
private int dfs(TreeNode root) {
30+
if (root == null) {
31+
return 0;
32+
}
33+
int left = dfs(root.left);
34+
int right = dfs(root.right);
35+
int sum = root.val + left + right;
36+
int current = map.getOrDefault(sum, 0) + 1;
37+
map.put(sum, current);
38+
max = Math.max(current, max);
39+
return sum;
40+
}
41+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode(int x) { val = x; }
8+
* }
9+
*/
10+
class Solution {
11+
int max = -1;
12+
int value = 0;
13+
14+
public int findBottomLeftValue(TreeNode root) {
15+
dfs(root, 0);
16+
return value;
17+
}
18+
19+
private void dfs(TreeNode root, int d) {
20+
if (root == null) {
21+
return;
22+
}
23+
d++;
24+
if (max < d) {
25+
max = d;
26+
value = root.val;
27+
}
28+
dfs(root.left, d);
29+
dfs(root.right, d);
30+
}
31+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /