Skip to content

Commit 2af0196

Browse files
committed
weekly contest 304
1 parent 155f661 commit 2af0196

File tree

2 files changed

+178
-2
lines changed

2 files changed

+178
-2
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
55
leetcode url: <https://leetcode.cn/u/cctest/>
66

77

8-
8+
* 🐍 [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
1111
* ☀️ [weekly contest 301](src/main/java/weekly/wk301.java) Greegy | Hash Table | Two Pointers|Dynamic Programming+Combinatorics
@@ -31,7 +31,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
3131

3232

3333

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

3636

3737

src/main/java/weekly/wk304.java

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.LinkedList;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Queue;
10+
11+
public class wk304 {
12+
13+
//简单题,排序+模拟
14+
//其实可以直接求不同数字个数
15+
public int minimumOperations(int[] nums) {
16+
Arrays.sort(nums);
17+
int i = 0;
18+
int max = nums[nums.length - 1];
19+
int sum = 0;
20+
int ans = 0;
21+
while (sum < max) {
22+
nums[i] -= sum;
23+
if (nums[i] <= 0) {
24+
i++;
25+
} else {
26+
sum += nums[i++];
27+
ans++;
28+
}
29+
}
30+
31+
return ans;
32+
33+
}
34+
35+
36+
//中等题,排序后开始拿1 2 3 ...个 要注意追后的时候要判断能不能构成一个新的组
37+
public int maximumGroups(int[] grades) {
38+
Arrays.sort(grades);
39+
int pre = 0;
40+
int count = 0;
41+
int i = 0;
42+
int ans = 0;
43+
for (i = 0; i < grades.length; ) {
44+
int pcount = 0;
45+
int psum = 0;
46+
while (i < grades.length && pcount <= count) {
47+
psum += grades[i++];
48+
pcount++;
49+
}
50+
if (psum <= pre || pcount <= count) {
51+
return ans;
52+
}
53+
ans++;
54+
pre = psum;
55+
count = pcount;
56+
}
57+
return ans;
58+
}
59+
60+
61+
//中等题,图遍历就行了,找出每个点到所有点的距离
62+
public int closestMeetingNode(int[] edges, int node1, int node2) {
63+
int[] dis1 = help(edges, node1);
64+
int[] dis2 = help(edges, node2);
65+
int ans = -1;
66+
int min = Integer.MAX_VALUE;
67+
for (int i = 0; i < dis1.length; i++) {
68+
if (dis1[i] == 0 || dis2[i] == 0) continue;
69+
int max = Math.max(dis1[i], dis2[i]);
70+
if (max < min) {
71+
ans = i;
72+
min = max;
73+
}
74+
}
75+
return ans;
76+
77+
}
78+
79+
int[] help(int[] edges, int node) {
80+
int[] dis = new int[edges.length];
81+
int step = 0;
82+
//没路可走 或者 已经访问过
83+
while (node != -1 && dis[node] == 0) {
84+
dis[node] = step;
85+
node = edges[node];
86+
step++;
87+
}
88+
return dis;
89+
}
90+
/* int[] help(int[] edges, int node) {
91+
int[] dis = new int[edges.length];
92+
Arrays.fill(dis, -1);
93+
boolean[] visited = new boolean[edges.length];
94+
Queue<Integer> queue = new LinkedList<>();
95+
queue.add(node);
96+
int step = 0;
97+
visited[node] = true;
98+
while (!queue.isEmpty()) {
99+
int size = queue.size();
100+
while (size-- > 0) {
101+
Integer cur = queue.poll();
102+
dis[cur] = step;
103+
int next = edges[cur];
104+
if (next == -1 || visited[next]) continue;
105+
queue.add(next);
106+
visited[next] = true;
107+
}
108+
step++;
109+
}
110+
return dis;
111+
}*/
112+
113+
114+
//困难题,周赛写的解法
115+
/*public int longestCycle(int[] edges) {
116+
int[] in = new int[edges.length];
117+
for (int i = 0; i < edges.length; i++) {
118+
if (edges[i] == -1) continue;
119+
in[edges[i]]++;
120+
}
121+
122+
int max = -1;
123+
boolean[] visited = new boolean[edges.length];
124+
for (int i = 0; i < in.length; i++) {
125+
max = Math.max(max, help2(edges, visited, i));
126+
}
127+
return max;
128+
}
129+
130+
int help2(int[] edges, boolean[] visited, int node) {
131+
List<Integer> path = new ArrayList<>();
132+
while (!visited[node]) {
133+
path.add(node);
134+
visited[node] = true;
135+
node = edges[node];
136+
if (node == -1) break;
137+
}
138+
if (node == -1) return -1;
139+
for (int i = 0; i < path.size(); i++) {
140+
if (path.get(i) == node) {
141+
return path.size() - i;
142+
}
143+
}
144+
return -1;
145+
}*/
146+
147+
148+
//时间计时法,还可以拓扑排序删除不是坏的变,然后bfs求环长度
149+
public int longestCycle(int[] edges) {
150+
int[] dis = new int[edges.length];
151+
152+
int ans = -1;
153+
int step = 1;
154+
for (int i = 0; i < edges.length; i++) {
155+
if (dis[i] == 0) {
156+
int start = step;
157+
int node = i;
158+
while (node != -1 && dis[node] == 0) {
159+
dis[node] = step++;
160+
node = edges[node];
161+
}
162+
if (node != -1 && dis[node] >= start) {
163+
ans = Math.max(step - dis[node], ans);
164+
}
165+
}
166+
}
167+
return ans;
168+
169+
}
170+
171+
172+
public static void main(String[] args) {
173+
wk304 w = new wk304();
174+
w.longestCycle(new int[]{3, 3, 4, 2, 3});
175+
}
176+
}

0 commit comments

Comments
 (0)