Skip to content

Commit 1811863

Browse files
committed
Updated tags
1 parent 8cba344 commit 1811863

File tree

4 files changed

+147
-124
lines changed

4 files changed

+147
-124
lines changed
Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
11
package g3501_3600.s3582_generate_tag_for_video_caption;
22

3-
// #Easy #2025_06_16_Time_12_ms_(100.00%)_Space_45.47_MB_(100.00%)
3+
// #Easy #String #Simulation #2025_06_17_Time_2_ms_(99.93%)_Space_43.54_MB_(89.89%)
44

5-
@SuppressWarnings("java:S135")
65
public class Solution {
76
public String generateTag(String caption) {
8-
if (caption.trim().isEmpty()) {
9-
return "#";
10-
}
11-
String[] arr = caption.trim().split("\\s+");
12-
StringBuilder res = new StringBuilder("#");
13-
String firstWord = arr[0];
14-
firstWord =
15-
firstWord.substring(0, 1).toLowerCase()
16-
+ (firstWord.length() > 1 ? firstWord.substring(1).toLowerCase() : "");
17-
res.append(firstWord);
18-
for (int i = 1; i < arr.length; i++) {
19-
String w = arr[i];
20-
if (w.isEmpty()) {
21-
continue;
7+
StringBuilder sb = new StringBuilder();
8+
sb.append('#');
9+
boolean space = false;
10+
caption = caption.trim();
11+
for (int i = 0; i < caption.length(); i++) {
12+
char c = caption.charAt(i);
13+
if (c == ' ') {
14+
space = true;
15+
}
16+
if (c >= 'A' && c <= 'Z') {
17+
if (space) {
18+
space = !space;
19+
sb.append(c);
20+
} else {
21+
sb.append(Character.toLowerCase(c));
22+
}
2223
}
23-
w =
24-
w.substring(0, 1).toUpperCase()
25-
+ (w.length() > 1 ? w.substring(1).toLowerCase() : "");
26-
res.append(w);
27-
if (res.length() >= 100) {
28-
break;
24+
if (c >= 'a' && c <= 'z') {
25+
if (space) {
26+
space = !space;
27+
sb.append(Character.toUpperCase(c));
28+
} else {
29+
sb.append(c);
30+
}
2931
}
3032
}
31-
return res.length() > 100 ? res.substring(0, 100) : res.toString();
33+
if (sb.length() > 100) {
34+
return sb.substring(0, 100);
35+
}
36+
return sb.toString();
3237
}
3338
}
Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
package g3501_3600.s3583_count_special_triplets;
22

3-
// #Medium #2025_06_16_Time_250_ms_(100.00%)_Space_62.22_MB_(100.00%)
4-
5-
import java.util.HashMap;
6-
import java.util.Map;
3+
// #Medium #Array #Hash_Table #Counting #2025_06_17_Time_30_ms_(99.81%)_Space_60.90_MB_(89.67%)
74

85
public class Solution {
96
public int specialTriplets(int[] nums) {
10-
int mod = 1_000_000_007;
11-
int res = 0;
12-
Map<Integer, Integer> left = new HashMap<>();
13-
Map<Integer, Integer> right = new HashMap<>();
14-
for (int num : nums) {
15-
right.put(num, right.getOrDefault(num, 0) + 1);
7+
long ans = 0;
8+
int[] sum = new int[200002];
9+
int[] left = new int[nums.length];
10+
for (int i = 0; i < nums.length; i++) {
11+
int curr = nums[i];
12+
sum[curr]++;
13+
left[i] = sum[curr * 2];
1614
}
17-
for (int num : nums) {
18-
right.put(num, right.get(num) - 1);
19-
int ci = left.getOrDefault(num * 2, 0);
20-
int ck = right.getOrDefault(num * 2, 0);
21-
res = (res + ci * ck) % mod;
22-
left.put(num, left.getOrDefault(num, 0) + 1);
15+
for (int i = 0; i < nums.length; i++) {
16+
int curr = nums[i];
17+
long leftCount = curr == 0 ? left[i] - 1 : left[i];
18+
long rightCount = sum[curr * 2] - left[i];
19+
if (leftCount != 0 && rightCount != 0) {
20+
ans += leftCount * rightCount;
21+
}
2322
}
24-
return res;
23+
return (int) (ans % 1000000007);
2524
}
2625
}

src/main/java/g3501_3600/s3584_maximum_product_of_first_and_last_elements_of_a_subsequence/Solution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3501_3600.s3584_maximum_product_of_first_and_last_elements_of_a_subsequence;
22

3-
// #Medium #2025_06_16_Time_4_ms_(87.17%)_Space_61.31_MB_(100.00%)
3+
// #Medium #Array #Two_Pointers #2025_06_17_Time_4_ms_(86.42%)_Space_60.92_MB_(51.72%)
44

55
public class Solution {
66
public long maximumProduct(int[] nums, int m) {
Lines changed: 102 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,142 @@
11
package g3501_3600.s3585_find_weighted_median_node_in_tree;
22

3-
// #Hard #2025_06_16_Time_162_ms_(100.00%)_Space_141.58_MB_(100.00%)
3+
// #Hard #Array #Dynamic_Programming #Tree #Binary_Search #Depth_First_Search
4+
// #2025_06_17_Time_66_ms_(94.96%)_Space_142.62_MB_(49.64%)
45

56
import java.util.ArrayList;
67
import java.util.Arrays;
78
import java.util.List;
89

910
@SuppressWarnings("java:S2234")
1011
public class Solution {
11-
private int log;
12-
private long[] dist;
12+
private List<List<int[]>> adj;
1313
private int[] depth;
14-
private int[][] up;
14+
private long[] dist;
15+
private int[][] parent;
16+
private int longMax;
17+
private int nodes;
1518

1619
public int[] findMedian(int n, int[][] edges, int[][] queries) {
17-
List<List<int[]>> adj = new ArrayList<>();
20+
nodes = n;
21+
if (n > 1) {
22+
longMax = (int) Math.ceil(Math.log(n) / Math.log(2));
23+
} else {
24+
longMax = 1;
25+
}
26+
adj = new ArrayList<>();
1827
for (int i = 0; i < n; i++) {
1928
adj.add(new ArrayList<>());
2029
}
2130
for (int[] edge : edges) {
22-
adj.get(edge[0]).add(new int[] {edge[1], edge[2]});
23-
adj.get(edge[1]).add(new int[] {edge[0], edge[2]});
31+
int u = edge[0];
32+
int v = edge[1];
33+
int w = edge[2];
34+
adj.get(u).add(new int[] {v, w});
35+
adj.get(v).add(new int[] {u, w});
2436
}
25-
dist = new long[n];
2637
depth = new int[n];
27-
log = 0;
28-
while (1 << log < n) {
29-
log++;
30-
}
31-
up = new int[n][log];
32-
for (int[] u : up) {
33-
Arrays.fill(u, -1);
38+
dist = new long[n];
39+
parent = new int[longMax][n];
40+
for (int i = 0; i < longMax; i++) {
41+
Arrays.fill(parent[i], -1);
3442
}
35-
dfs(0, -1, adj, 0, 0);
43+
dfs(0, -1, 0, 0L);
44+
buildLcaTable();
3645
int[] ans = new int[queries.length];
37-
for (int i = 0; i < queries.length; i++) {
38-
int[] query = queries[i];
39-
int first = query[0];
40-
int second = query[1];
41-
long distance = getDistance(first, second);
42-
long needed = (distance + 1) / 2;
43-
int mid = lca(first, second);
44-
if (getDistance(first, mid) < needed) {
45-
needed -= getDistance(first, mid);
46-
first = mid;
47-
} else {
48-
second = mid;
49-
}
50-
if (depth[first] <= depth[second]) {
51-
long curDistance = getDistance(first, second);
52-
for (int j = log - 1; j >= 0; j--) {
53-
if (up[second][j] == -1
54-
|| curDistance - getDistance(up[second][j], second) < needed) {
55-
continue;
56-
}
57-
curDistance -= getDistance(up[second][j], second);
58-
second = up[second][j];
59-
}
60-
ans[i] = second;
61-
} else {
62-
long curDistance = 0;
63-
for (int j = log - 1; j >= 0; j--) {
64-
if (up[first][j] == -1
65-
|| curDistance + getDistance(up[first][j], first) >= needed) {
66-
continue;
67-
}
68-
curDistance += getDistance(up[first][j], first);
69-
first = up[first][j];
70-
}
71-
ans[i] = up[first][0];
72-
}
46+
int[] sabrelonta;
47+
for (int qIdx = 0; qIdx < queries.length; qIdx++) {
48+
sabrelonta = queries[qIdx];
49+
int u = sabrelonta[0];
50+
int v = sabrelonta[1];
51+
ans[qIdx] = findMedianNode(u, v);
7352
}
53+
7454
return ans;
7555
}
7656

77-
private long getDistance(int from, int to) {
78-
if (from == to) {
79-
return 0;
57+
private void dfs(int u, int p, int d, long currentDist) {
58+
depth[u] = d;
59+
parent[0][u] = p;
60+
dist[u] = currentDist;
61+
for (int[] edge : adj.get(u)) {
62+
int v = edge[0];
63+
int w = edge[1];
64+
if (v == p) {
65+
continue;
66+
}
67+
dfs(v, u, d + 1, currentDist + w);
8068
}
81-
int ancesor = lca(from, to);
82-
return dist[from] + dist[to] - 2 * dist[ancesor];
8369
}
8470

85-
private int lca(int first, int second) {
86-
if (depth[first] < depth[second]) {
87-
return lca(second, first);
71+
private void buildLcaTable() {
72+
for (int k = 1; k < longMax; k++) {
73+
for (int node = 0; node < nodes; node++) {
74+
if (parent[k - 1][node] != -1) {
75+
parent[k][node] = parent[k - 1][parent[k - 1][node]];
76+
}
77+
}
8878
}
89-
for (int i = log - 1; i >= 0; i--) {
90-
if (depth[first] - (1 << i) >= depth[second]) {
91-
first = up[first][i];
79+
}
80+
81+
private int getKthAncestor(int u, int k) {
82+
for (int p = longMax - 1; p >= 0; p--) {
83+
if (u == -1) {
84+
break;
85+
}
86+
if (((k >> p) & 1) == 1) {
87+
u = parent[p][u];
9288
}
9389
}
94-
if (first == second) {
95-
return second;
90+
return u;
91+
}
92+
93+
private int getLCA(int u, int v) {
94+
if (depth[u] < depth[v]) {
95+
int temp = u;
96+
u = v;
97+
v = temp;
9698
}
97-
for (int i = log - 1; i >= 0; i--) {
98-
if (depth[first] != -1 && up[first][i] != up[second][i]) {
99-
first = up[first][i];
100-
second = up[second][i];
99+
u = getKthAncestor(u, depth[u] - depth[v]);
100+
if (u == v) {
101+
return u;
102+
}
103+
for (int p = longMax - 1; p >= 0; p--) {
104+
if (parent[p][u] != -1 && parent[p][u] != parent[p][v]) {
105+
u = parent[p][u];
106+
v = parent[p][v];
101107
}
102108
}
103-
first = up[first][0];
104-
return first;
109+
return parent[0][u];
105110
}
106111

107-
private void dfs(int current, int parent, List<List<int[]>> adj, long curDist, int curDepth) {
108-
up[current][0] = parent;
109-
for (int i = 1; i < log; i++) {
110-
if (up[current][i - 1] != -1) {
111-
up[current][i] = up[up[current][i - 1]][i - 1];
112-
}
112+
private int findMedianNode(int u, int v) {
113+
if (u == v) {
114+
return u;
113115
}
114-
dist[current] = curDist;
115-
depth[current] = curDepth;
116-
for (int[] next : adj.get(current)) {
117-
if (next[0] == parent) {
118-
continue;
116+
int lca = getLCA(u, v);
117+
long totalPathWeight = dist[u] + dist[v] - 2 * dist[lca];
118+
long halfWeight = (totalPathWeight + 1) / 2L;
119+
if (dist[u] - dist[lca] >= halfWeight) {
120+
int curr = u;
121+
for (int p = longMax - 1; p >= 0; p--) {
122+
int nextNode = parent[p][curr];
123+
if (nextNode != -1 && (dist[u] - dist[nextNode] < halfWeight)) {
124+
curr = nextNode;
125+
}
126+
}
127+
return parent[0][curr];
128+
} else {
129+
long remainingWeightFromLCA = halfWeight - (dist[u] - dist[lca]);
130+
int curr = v;
131+
for (int p = longMax - 1; p >= 0; p--) {
132+
int nextNode = parent[p][curr];
133+
if (nextNode != -1
134+
&& depth[nextNode] >= depth[lca]
135+
&& (dist[nextNode] - dist[lca]) >= remainingWeightFromLCA) {
136+
curr = nextNode;
137+
}
119138
}
120-
dfs(next[0], current, adj, curDist + next[1], curDepth + 1);
139+
return curr;
121140
}
122141
}
123142
}

0 commit comments

Comments
 (0)