Skip to content

Commit 9369854

Browse files
committed
feat:add solution 301(d),507(s),508(m),513(m)
1 parent 8ac4e34 commit 9369854

File tree

4 files changed

+165
-0
lines changed

4 files changed

+165
-0
lines changed
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+
}
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+
}
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+
}
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)