Skip to content

Commit 8f7bbed

Browse files
committed
weekly contest 305
1 parent 2af0196 commit 8f7bbed

File tree

2 files changed

+163
-2
lines changed

2 files changed

+163
-2
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
44

55
leetcode url: <https://leetcode.cn/u/cctest/>
66

7-
7+
* 🐨 [weekly contest 305](src/main/java/weekly/wk305.java) Array | Array | DP | DP
88
* 🐍 [weekly contest 304](src/main/java/weekly/wk304.java) Array | Array Greedy | Graph | Graph Topological Sort
99
* ☁️ [weekly contest 303](src/main/java/weekly/wk303.java) Array | Simulation | Heap (Priority Queue)|Binary Search
1010
* ☀️ [weekly contest 302](src/main/java/weekly/wk302.java) Array | Heap | Heap| Math GCD
@@ -31,7 +31,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
3131

3232

3333

34-
🐨 🐻 🐷 🐽 🐮 🐗 🐵 🐒 🐴 🐎 🐫 🐑 🐘 🐼
34+
🐻 🐷 🐽 🐮 🐗 🐵 🐒 🐴 🐎 🐫 🐑 🐘 🐼
3535

3636

3737

src/main/java/weekly/wk305.java

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.LinkedList;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.Queue;
11+
import java.util.Set;
12+
13+
public class wk305 {
14+
//ranking: 903 / 7465
15+
16+
//简单题,遍历即可
17+
public int arithmeticTriplets(int[] nums, int diff) {
18+
int ans = 0;
19+
for (int i = 0; i < nums.length; i++) {
20+
for (int j = i + 1; j < nums.length; j++) {
21+
for (int k = j + 1; k < nums.length; k++) {
22+
if (nums[j] - nums[i] == diff && nums[k] - nums[j] == diff) {
23+
ans++;
24+
}
25+
}
26+
}
27+
}
28+
return ans;
29+
}
30+
31+
32+
//中等题,bfs+限制
33+
public int reachableNodes(int n, int[][] edges, int[] restricted) {
34+
Map<Integer, List<Integer>> map = new HashMap<>();
35+
for (int[] edge : edges) {
36+
if (!map.containsKey(edge[0])) map.put(edge[0], new ArrayList<>());
37+
if (!map.containsKey(edge[1])) map.put(edge[1], new ArrayList<>());
38+
map.get(edge[0]).add(edge[1]);
39+
map.get(edge[1]).add(edge[0]);
40+
}
41+
42+
Set<Integer> set = new HashSet<>();
43+
for (int i : restricted) {
44+
set.add(i);
45+
}
46+
47+
Queue<Integer> queue = new LinkedList<>();
48+
queue.add(0);
49+
int ans = 1;
50+
boolean[] visited = new boolean[n];
51+
visited[0] = true;
52+
53+
while (!queue.isEmpty()) {
54+
Integer poll = queue.poll();
55+
for (Integer next : map.getOrDefault(poll, new ArrayList<>())) {
56+
if (visited[next] || set.contains(next)) continue;
57+
visited[next] = true;
58+
queue.add(next);
59+
ans++;
60+
}
61+
}
62+
return ans;
63+
64+
}
65+
66+
/* public boolean validPartition(int[] nums) {
67+
memo = new int[nums.length];
68+
return help(nums, 0);
69+
}
70+
71+
int[] memo;
72+
73+
boolean help(int[] nums, int index) {
74+
if (index >= nums.length) return true;
75+
76+
if (memo[index] != 0) {
77+
return memo[index] == 1;
78+
}
79+
int end = index + 1;
80+
boolean a = false, b = false, c = false;
81+
if (end < nums.length && nums[index] == nums[end]) {
82+
a = help(nums, end + 1);
83+
}
84+
end++;
85+
if (end < nums.length && nums[index] == nums[index + 1] && nums[index + 1] == nums[end]) {
86+
b = help(nums, end + 1);
87+
}
88+
if (end < nums.length && nums[index] + 1 == nums[index + 1] && nums[index + 1] + 1 == nums[end]) {
89+
c = help(nums, end + 1);
90+
}
91+
boolean res = a | b | c;
92+
if (res) {
93+
memo[index] = 1;
94+
} else {
95+
memo[index] = -1;
96+
}
97+
return res;
98+
}*/
99+
100+
//中等题,暴力dp,不要想什么贪心做发 - -!
101+
public boolean validPartition(int[] nums) {
102+
boolean[] dp = new boolean[nums.length + 1];
103+
dp[0] = true;
104+
for (int i = 0; i < nums.length; i++) {
105+
int start = i - 1;
106+
if (start < 0) continue;
107+
if (nums[start] == nums[i]) {//两个相同
108+
dp[i + 1] |= dp[start];
109+
}
110+
start--;
111+
if (start < 0) continue;
112+
if (nums[start] == nums[i - 1] && nums[start] == nums[i]) {//三个相同
113+
dp[i + 1] |= dp[start];
114+
}
115+
if (nums[start] + 1 == nums[i - 1] && nums[i - 1] + 1 == nums[i]) {//三个相差1
116+
dp[i + 1] |= dp[start];
117+
}
118+
}
119+
return dp[nums.length];
120+
}
121+
122+
//中等题,直接一维dp
123+
public int longestIdealString(String s, int k) {
124+
char[] chars = s.toCharArray();
125+
int[] dp = new int[s.length()];
126+
int[] index = new int[26];//记录字母的位置
127+
Arrays.fill(index, -1);//初试为-1都不存在
128+
int max = 0;
129+
for (int i = 0; i < chars.length; i++) {
130+
char num = chars[i];
131+
dp[i] = 1;
132+
//j表示相差k的字母
133+
for (int j = Math.max(0, num - 'a' - k); j <= Math.min(25, num - 'a' + k); j++) {
134+
if (index[j] < 0) continue;
135+
//更新dp[i], 可到达的字母+1
136+
dp[i] = Math.max(dp[index[j]] + 1, dp[i]);//
137+
}
138+
index[num - 'a'] = i;
139+
max = Math.max(max, dp[i]);
140+
}
141+
return max;
142+
}
143+
144+
//或者直接dp[26]
145+
/* public int longestIdealString(String s, int k) {
146+
char[] chars = s.toCharArray();
147+
int[] dp = new int[26];
148+
int max = 0;
149+
for (int i = 0; i < chars.length; i++) {
150+
char num = chars[i];
151+
//j表示相差k的字母
152+
for (int j = Math.max(0, num - 'a' - k); j <= Math.min(25, num - 'a' + k); j++) {
153+
dp[num-'a'] = Math.max(dp[j], dp[num-'a']);
154+
}
155+
dp[num-'a'] ++;
156+
max = Math.max(max, dp[i]);
157+
}
158+
return max;
159+
160+
}*/
161+
}

0 commit comments

Comments
 (0)