Skip to content

Commit 6d059f0

Browse files
committed
Updated tags
1 parent b70e36a commit 6d059f0

File tree

8 files changed

+166
-152
lines changed

8 files changed

+166
-152
lines changed
Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,47 @@
11
package g3501_3600.s3572_maximize_ysum_by_picking_a_triplet_of_distinct_xvalues;
22

3-
// #Medium #2025_06_08_Time_51_ms_(100.00%)_Space_57.50_MB_(100.00%)
4-
5-
import java.util.Collections;
6-
import java.util.HashMap;
7-
import java.util.Map;
8-
import java.util.PriorityQueue;
3+
// #Medium #Array #Hash_Table #Sorting #Greedy #Heap_Priority_Queue
4+
// #2025_06_10_Time_2_ms_(100.00%)_Space_64.25_MB_(40.62%)
95

106
public class Solution {
117
public int maxSumDistinctTriplet(int[] x, int[] y) {
12-
Map<Integer, Integer> map = new HashMap<>();
13-
for (int i = 0; i < x.length; i++) {
14-
map.put(x[i], Math.max(map.getOrDefault(x[i], 0), y[i]));
8+
int index = -1;
9+
int max = -1;
10+
int sum = 0;
11+
for (int i = 0; i < y.length; i++) {
12+
if (y[i] > max) {
13+
max = y[i];
14+
index = i;
15+
}
16+
}
17+
sum += max;
18+
if (max == -1) {
19+
return -1;
1520
}
16-
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
17-
for (int val : map.values()) {
18-
maxHeap.add(val);
21+
int index2 = -1;
22+
int index3 = -1;
23+
max = -1;
24+
for (int i = 0; i < y.length; i++) {
25+
if (y[i] > max && x[i] != x[index]) {
26+
max = y[i];
27+
index2 = i;
28+
}
1929
}
20-
if (maxHeap.size() < 3) {
30+
sum += max;
31+
if (max == -1) {
2132
return -1;
2233
}
23-
int sum = 0;
24-
for (int i = 0; i < 3; i++) {
25-
sum += maxHeap.poll();
34+
max = -1;
35+
for (int i = 0; i < y.length; i++) {
36+
if (y[i] > max && x[i] != x[index] && x[i] != x[index2]) {
37+
max = y[i];
38+
index3 = i;
39+
}
40+
}
41+
if (max == -1) {
42+
return -1;
2643
}
44+
sum += max;
2745
return sum;
2846
}
2947
}
Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,28 @@
11
package g3501_3600.s3573_best_time_to_buy_and_sell_stock_v;
22

3-
// #Medium #2025_06_08_Time_259_ms_(100.00%)_Space_87.72_MB_(100.00%)
4-
5-
import java.util.Arrays;
3+
// #Medium #Array #Dynamic_Programming #2025_06_10_Time_10_ms_(99.46%)_Space_44.46_MB_(97.36%)
64

75
public class Solution {
8-
private static final long MN = (long) -1e14;
9-
private long[][][] dp;
10-
private int[] prices;
11-
12-
private long f(int i, int k, int state) {
13-
if (i == prices.length) {
14-
return (state == 0) ? 0 : MN;
15-
}
16-
if (dp[i][k][state] != MN) {
17-
return dp[i][k][state];
18-
}
19-
long p = prices[i];
20-
long profit = MN;
21-
profit = Math.max(profit, f(i + 1, k, state));
22-
if (state == 0) {
23-
profit = Math.max(profit, f(i + 1, k, 1) - p);
24-
profit = Math.max(profit, f(i + 1, k, 2) + p);
25-
} else if (k > 0) {
26-
if (state == 1) {
27-
profit = Math.max(profit, f(i + 1, k - 1, 0) + p);
28-
} else {
29-
profit = Math.max(profit, f(i + 1, k - 1, 0) - p);
30-
}
31-
}
32-
dp[i][k][state] = profit;
33-
return profit;
34-
}
35-
366
public long maximumProfit(int[] prices, int k) {
37-
this.prices = prices;
387
int n = prices.length;
39-
dp = new long[n + 1][k + 1][3];
40-
for (long[][] twoD : dp) {
41-
for (long[] oneD : twoD) {
42-
Arrays.fill(oneD, MN);
8+
long[] prev = new long[n];
9+
long[] curr = new long[n];
10+
for (int t = 1; t <= k; t++) {
11+
long bestLong = -prices[0];
12+
long bestShort = prices[0];
13+
curr[0] = 0;
14+
for (int i = 1; i < n; i++) {
15+
long res = curr[i - 1];
16+
res = Math.max(res, prices[i] + bestLong);
17+
res = Math.max(res, -prices[i] + bestShort);
18+
curr[i] = res;
19+
bestLong = Math.max(bestLong, prev[i - 1] - prices[i]);
20+
bestShort = Math.max(bestShort, prev[i - 1] + prices[i]);
4321
}
22+
long[] tmp = prev;
23+
prev = curr;
24+
curr = tmp;
4425
}
45-
return f(0, k, 0);
26+
return prev[n - 1];
4627
}
4728
}
Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,64 @@
11
package g3501_3600.s3574_maximize_subarray_gcd_score;
22

3-
// #Hard #2025_06_08_Time_364_ms_(100.00%)_Space_44.70_MB_(100.00%)
3+
// #Hard #Array #Math #Enumeration #Number_Theory
4+
// #2025_06_10_Time_13_ms_(100.00%)_Space_45.07_MB_(78.08%)
45

56
public class Solution {
67
public long maxGCDScore(int[] nums, int k) {
8+
int mx = 0;
9+
for (int x : nums) {
10+
mx = Math.max(mx, x);
11+
}
12+
int width = 32 - Integer.numberOfLeadingZeros(mx);
13+
List<Integer>[] lowbitPos = new List[width];
14+
Arrays.setAll(lowbitPos, i -> new ArrayList<>());
15+
int[][] intervals = new int[width + 1][3];
16+
int size = 0;
717
long ans = 0;
8-
int n = nums.length;
9-
for (int i = 0; i < n; i++) {
10-
long countGCD = 0;
11-
long oddCount = 0;
12-
long ongoingGCD = 0;
13-
for (int j = i; j < n; j++) {
14-
long currentGCD = gcd(ongoingGCD, nums[j]);
15-
if (currentGCD != ongoingGCD) {
16-
ongoingGCD = currentGCD;
17-
countGCD = 1;
18-
} else if (nums[j] == ongoingGCD) {
19-
countGCD++;
20-
}
21-
if (nums[j] % 2 != 0) {
22-
oddCount++;
18+
for (int i = 0; i < nums.length; i++) {
19+
int x = nums[i];
20+
int tz = Integer.numberOfTrailingZeros(x);
21+
lowbitPos[tz].add(i);
22+
for (int j = 0; j < size; j++) {
23+
intervals[j][0] = gcd(intervals[j][0], x);
24+
}
25+
intervals[size][0] = x;
26+
intervals[size][1] = i - 1;
27+
intervals[size][2] = i;
28+
size++;
29+
int idx = 1;
30+
for (int j = 1; j < size; j++) {
31+
if (intervals[j][0] != intervals[j - 1][0]) {
32+
intervals[idx][0] = intervals[j][0];
33+
intervals[idx][1] = intervals[j][1];
34+
intervals[idx][2] = intervals[j][2];
35+
idx++;
36+
} else {
37+
intervals[idx - 1][2] = intervals[j][2];
2338
}
24-
int len = j - i + 1;
25-
long res = ongoingGCD * len;
26-
if (ongoingGCD % 2 != 0) {
27-
if (k >= oddCount) {
28-
res *= 2L;
29-
}
30-
} else if (k >= countGCD) {
31-
res *= 2L;
39+
}
40+
size = idx;
41+
for (int j = 0; j < size; j++) {
42+
int g = intervals[j][0];
43+
int l = intervals[j][1];
44+
int r = intervals[j][2];
45+
ans = Math.max(ans, (long) g * (i - l));
46+
List<Integer> pos = lowbitPos[Integer.numberOfTrailingZeros(g)];
47+
int minL = pos.size() > k ? Math.max(l, pos.get(pos.size() - k - 1)) : l;
48+
if (minL < r) {
49+
ans = Math.max(ans, (long) g * 2 * (i - minL));
3250
}
33-
ans = Math.max(ans, res);
3451
}
3552
}
3653
return ans;
3754
}
3855

39-
private long gcd(long a, long b) {
40-
if (a == 0) {
41-
return b;
56+
private int gcd(int a, int b) {
57+
while (a != 0) {
58+
int tmp = a;
59+
a = b % a;
60+
b = tmp;
4261
}
43-
return gcd(b % a, a);
62+
return b;
4463
}
4564
}
Lines changed: 59 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,84 @@
11
package g3501_3600.s3575_maximum_good_subtree_score;
22

3-
// #Hard #2025_06_08_Time_564_ms_(100.00%)_Space_45.22_MB_(100.00%)
3+
// #Hard #Array #Dynamic_Programming #Depth_First_Search #Tree #Bit_Manipulation #Bitmask
4+
// #2025_06_10_Time_92_ms_(98.73%)_Space_55.23_MB_(11.71%)
45

56
import java.util.ArrayList;
6-
import java.util.HashMap;
7-
import java.util.HashSet;
87
import java.util.List;
9-
import java.util.Map;
10-
import java.util.Set;
118

129
@SuppressWarnings("unchecked")
1310
public class Solution {
14-
private long ans;
15-
private static final int MOD = 1_000_000_007;
11+
private int digits = 10;
12+
private int full = 1 << digits;
13+
private long neg = Long.MIN_VALUE / 4;
14+
private long mod = (long) 1e9 + 7;
15+
private List<Integer>[] tree;
16+
private int[] val;
17+
private int[] mask;
18+
private boolean[] isOk;
19+
private long res = 0;
1620

1721
public int goodSubtreeSum(int[] vals, int[] par) {
1822
int n = vals.length;
19-
List<Integer>[] adj = new ArrayList[n];
23+
val = vals;
24+
mask = new int[n];
25+
isOk = new boolean[n];
2026
for (int i = 0; i < n; i++) {
21-
adj[i] = new ArrayList<>();
27+
int m = 0;
28+
int v = vals[i];
29+
boolean valid = true;
30+
while (v > 0) {
31+
int d = v % 10;
32+
if (((m >> d) & 1) == 1) {
33+
valid = false;
34+
break;
35+
}
36+
m |= 1 << d;
37+
v /= 10;
38+
}
39+
mask[i] = m;
40+
isOk[i] = valid;
2241
}
42+
tree = new ArrayList[n];
43+
Arrays.setAll(tree, ArrayList::new);
44+
int root = 0;
2345
for (int i = 1; i < n; i++) {
24-
adj[par[i]].add(i);
46+
tree[par[i]].add(i);
2547
}
26-
this.ans = 0;
27-
dfs(0, vals, adj);
28-
return (int) ((this.ans % MOD + MOD) % MOD);
48+
dfs(root);
49+
return (int) (res % mod);
2950
}
3051

31-
private Map<Integer, Integer> dfs(int u, int[] vals, List<Integer>[] adj) {
32-
// du: The DP map for the subtree at node u.
33-
// Key: bitmask of digits. Value: max sum for that combination of digits.
34-
Map<Integer, Integer> du = new HashMap<>();
35-
// Base case: A sum of 0 is possible with an empty set of digits (mask 0).
36-
du.put(0, 0);
37-
// Process the current node's value.
38-
String s = String.valueOf(Math.abs(vals[u]));
39-
if (hasUniqueDigits(s)) {
40-
int mask = 0;
41-
for (char c : s.toCharArray()) {
42-
mask |= (1 << (c - '0'));
43-
}
44-
du.put(mask, vals[u]);
52+
private long[] dfs(int u) {
53+
long[] dp = new long[full];
54+
Arrays.fill(dp, neg);
55+
dp[0] = 0;
56+
if (isOk[u]) {
57+
dp[mask[u]] = val[u];
4558
}
46-
for (int v : adj[u]) {
47-
Map<Integer, Integer> dv = dfs(v, vals, adj);
48-
Map<Integer, Integer> duSnapshot = new HashMap<>(du);
49-
for (Map.Entry<Integer, Integer> entryV : dv.entrySet()) {
50-
int mv = entryV.getKey();
51-
int sv = entryV.getValue();
52-
for (Map.Entry<Integer, Integer> entryU : duSnapshot.entrySet()) {
53-
int mu = entryU.getKey();
54-
int su = entryU.getValue();
55-
// If the digit sets are disjoint (no common bits in masks), we can combine
56-
// them.
57-
if ((mu & mv) == 0) {
58-
int newMask = mu | mv;
59-
int newSum = su + sv;
60-
// Update `du` with the best possible sum for the new combined mask.
61-
du.put(
62-
newMask,
63-
Math.max(du.getOrDefault(newMask, Integer.MIN_VALUE), newSum));
59+
for (int v : tree[u]) {
60+
long[] child = dfs(v);
61+
long[] newDp = Arrays.copyOf(dp, full);
62+
for (int m1 = 0; m1 < full; m1++) {
63+
if (dp[m1] < 0) {
64+
continue;
65+
}
66+
int remain = full - 1 - m1;
67+
for (int m2 = remain; m2 > 0; m2 = (m2 - 1) & remain) {
68+
if (child[m2] < 0) {
69+
continue;
6470
}
71+
int newM = m1 | m2;
72+
newDp[newM] = Math.max(newDp[newM], dp[m1] + child[m2]);
6573
}
6674
}
75+
dp = newDp;
6776
}
68-
// After processing all children, the max value in `du` is the "good" sum for the subtree at
69-
// u.
70-
// Initialize with a very small number to correctly find the maximum, even if sums are
71-
// negative.
72-
int maxSubtreeSum = Integer.MIN_VALUE;
73-
for (int sum : du.values()) {
74-
maxSubtreeSum = Math.max(maxSubtreeSum, sum);
75-
}
76-
// Add this subtree's best sum to the total answer.
77-
// If du is empty (should not happen due to {0:0}), we add 0.
78-
this.ans += (maxSubtreeSum == Integer.MIN_VALUE ? 0 : maxSubtreeSum);
79-
return du;
80-
}
81-
82-
private boolean hasUniqueDigits(String s) {
83-
Set<Character> digits = new HashSet<>();
84-
for (char c : s.toCharArray()) {
85-
if (!digits.add(c)) {
86-
return false;
87-
}
77+
long best = 0;
78+
for (long v : dp) {
79+
best = Math.max(best, v);
8880
}
89-
return true;
81+
res = (res + best) % mod;
82+
return dp;
9083
}
9184
}

src/main/java/g3501_3600/s3576_transform_array_to_all_equal_elements/Solution.java

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

3-
// #Medium #2025_06_08_Time_7_ms_(99.86%)_Space_62.66_MB_(5.31%)
3+
// #Medium #Array #Greedy #2025_06_10_Time_7_ms_(99.81%)_Space_56.56_MB_(99.57%)
44

55
import java.util.ArrayList;
66
import java.util.List;

src/main/java/g3501_3600/s3577_count_the_number_of_computer_unlocking_permutations/Solution.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package g3501_3600.s3577_count_the_number_of_computer_unlocking_permutations;
22

3-
// #Medium #2025_06_08_Time_1_ms_(100.00%)_Space_62.08_MB_(35.87%)
3+
// #Medium #Array #Math #Combinatorics #Brainteaser
4+
// #2025_06_10_Time_1_ms_(100.00%)_Space_62.24_MB_(22.08%)
45

56
public class Solution {
67
private static final int MOD = 1_000_000_007;

0 commit comments

Comments
 (0)