0%

第305场周赛-264名-22分钟4题

1659841108569

本期总结:#

  1. bfs时,必须要记得在对第一个入队节点做vis[start]=true的操作!否则一定会导致WA!

算术三元组的数目 - 力扣 (LeetCode) 竞赛

直接3个for循环搞定


受限条件下可到达节点的数目 - 力扣 (LeetCode) 竞赛

1659841166952

这么简单的bfs题竟然错了一次(用bfs是因为节点数量很多有10^5个)

因为bfs时忘了对第一个入队节点做vis[起点] = true;的操作, 直接导致错失前200

另外这题甚至不应该思考, 直接开写才对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public static List<Integer>[] edgToNextNodeLists(int n, int[][] edges) {
List<Integer>[] list = new List[n];
for (int i = 0;i<n;i++) {
list[i] = new ArrayList<>();
}

for (int[] edg : edges) {
int s = edg[0];
int e = edg[1];
list[s].add(e);
list[e].add(s);
}
return list;
}

public int reachableNodes(int n, int[][] edges, int[] restricted) {
List<Integer>[] nextNodes = edgToNextNodeLists(n, edges);
Queue<Integer> queue = new LinkedList<>();
queue.offer(0);
Set<Integer> resSet = Arrays.stream(restricted).boxed().collect(Collectors.toSet());
boolean[] vis = new boolean[n];
int count = 0;
vis[0] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
count++;
for (int nextNode : nextNodes[node]) {
if (vis[nextNode] || resSet.contains(nextNode)) {
continue;
}
queue.offer(nextNode);
vis[nextNode] = true;
}
}
return count;
}
}

检查数组是否存在有效划分 - 力扣 (LeetCode) 竞赛

1659841394607

可检查范围最多就3个,如果[4,5,6]如果符合,那我只要检查4前面那个数字是否有符合的划分,划分可以传递,因此直接动态规划即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public boolean validPartition(int[] nums) {
int n = nums.length;
boolean[] dp = new boolean[n];
for (int i = 0; i < nums.length;i++) {
int num = nums[i];
if (i-1>=0 && nums[i-1] == num) {
dp[i] |= (i-2>=0?dp[i-2] : true);
}
if (i-2>=0 && nums[i-1] == num && nums[i-2] == num) {
dp[i] |= (i-3>=0?dp[i-3] : true);
}
if (i-2>=0 && nums[i-1] == num-1 && nums[i-2] == num-2) {
dp[i] |= (i-3>=0?dp[i-3] : true);
}
}
return dp[n-1];
}

最长理想子序列 - 力扣 (LeetCode) 竞赛

1659841530495

显然是动态规划, 在[a-z]中找到符合k差值的字母, 根据字母已记录的最长子序列长度,进行+1即可。

最开始想歪了,想成了k是位置距离了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public int longestIdealString(String s, int k) {
int n = s.length();
int[] dp = new int[26];

for (int i = 0; i < s.length();i++) {
int c = s.charAt(i) - 'a';
int max = Integer.MIN_VALUE;
for (int lastc = c-k;lastc <= c+k;lastc++) {
if (lastc < 0 || lastc > 25) {
continue;
}
max = Math.max(max, dp[lastc] + 1);
}
dp[c] = max;
}
return Arrays.stream(dp).max().getAsInt();
}
}