Skip to content

Commit b98fbb2

Browse files
committed
Improved tasks 1659, 3435, 3457
1 parent e9c5eb7 commit b98fbb2

File tree

4 files changed

+163
-137
lines changed

4 files changed

+163
-137
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2150,7 +2150,7 @@
21502150
| 3439 |[Reschedule Meetings for Maximum Free Time I](src/main/java/g3401_3500/s3439_reschedule_meetings_for_maximum_free_time_i)| Medium | Array, Greedy, Sliding_Window | 2 | 83.15
21512151
| 3438 |[Find Valid Pair of Adjacent Digits in String](src/main/java/g3401_3500/s3438_find_valid_pair_of_adjacent_digits_in_string)| Easy | String, Hash_Table, Counting | 1 | 100.00
21522152
| 3436 |[Find Valid Emails](src/main/java/g3401_3500/s3436_find_valid_emails)| Easy | Database | 451 | 70.84
2153-
| 3435 |[Frequencies of Shortest Supersequences](src/main/java/g3401_3500/s3435_frequencies_of_shortest_supersequences)| Hard | Array, String, Bit_Manipulation, Graph, Enumeration, Topological_Sort | 16 | 95.35
2153+
| 3435 |[Frequencies of Shortest Supersequences](src/main/java/g3401_3500/s3435_frequencies_of_shortest_supersequences)| Hard | Array, String, Bit_Manipulation, Graph, Enumeration, Topological_Sort | 20 | 97.26
21542154
| 3434 |[Maximum Frequency After Subarray Operation](src/main/java/g3401_3500/s3434_maximum_frequency_after_subarray_operation)| Medium | Array, Hash_Table, Dynamic_Programming, Greedy, Prefix_Sum | 47 | 100.00
21552155
| 3433 |[Count Mentions Per User](src/main/java/g3401_3500/s3433_count_mentions_per_user)| Medium | Array, Math, Sorting, Simulation | 12 | 99.94
21562156
| 3432 |[Count Partitions with Even Sum Difference](src/main/java/g3401_3500/s3432_count_partitions_with_even_sum_difference)| Easy | Array, Math, Prefix_Sum | 1 | 100.00
@@ -3539,7 +3539,7 @@
35393539
| 1663 |[Smallest String With A Given Numeric Value](src/main/java/g1601_1700/s1663_smallest_string_with_a_given_numeric_value)| Medium | String, Greedy | 22 | 75.05
35403540
| 1662 |[Check If Two String Arrays are Equivalent](src/main/java/g1601_1700/s1662_check_if_two_string_arrays_are_equivalent)| Easy | Array, String | 0 | 100.00
35413541
| 1661 |[Average Time of Process per Machine](src/main/java/g1601_1700/s1661_average_time_of_process_per_machine)| Easy | Database | 429 | 79.06
3542-
| 1659 |[Maximize Grid Happiness](src/main/java/g1601_1700/s1659_maximize_grid_happiness)| Hard | Dynamic_Programming, Bit_Manipulation, Bitmask, Memoization | 95 | 75.00
3542+
| 1659 |[Maximize Grid Happiness](src/main/java/g1601_1700/s1659_maximize_grid_happiness)| Hard | Dynamic_Programming, Bit_Manipulation, Bitmask, Memoization | 39 | 86.36
35433543
| 1658 |[Minimum Operations to Reduce X to Zero](src/main/java/g1601_1700/s1658_minimum_operations_to_reduce_x_to_zero)| Medium | Array, Hash_Table, Binary_Search, Prefix_Sum, Sliding_Window | 4 | 98.95
35443544
| 1657 |[Determine if Two Strings Are Close](src/main/java/g1601_1700/s1657_determine_if_two_strings_are_close)| Medium | String, Hash_Table, Sorting | 12 | 97.58
35453545
| 1656 |[Design an Ordered Stream](src/main/java/g1601_1700/s1656_design_an_ordered_stream)| Easy | Array, Hash_Table, Design, Data_Stream | 95 | 74.07

src/main/java/g1601_1700/s1659_maximize_grid_happiness/readme.md

Lines changed: 81 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -70,73 +70,95 @@ The grid happiness is 90 + 80 + 90 = 260.
7070
## Solution
7171

7272
```java
73+
@SuppressWarnings("java:S107")
7374
public class Solution {
74-
private int m;
75-
private int n;
76-
private int[][][][][] dp;
77-
private int notPlace = 0;
78-
private int intro = 1;
79-
private int extro = 2;
80-
private int mod;
81-
82-
public int getMaxGridHappiness(int m, int n, int introvertsCount, int extrovertsCount) {
83-
this.m = m;
84-
this.n = n;
85-
int numOfState = (int) Math.pow(3, n);
86-
this.dp = new int[m][n][introvertsCount + 1][extrovertsCount + 1][numOfState];
87-
this.mod = numOfState / 3;
88-
return dfs(0, 0, introvertsCount, extrovertsCount, 0);
89-
}
90-
91-
private int dfs(int x, int y, int ic, int ec, int state) {
92-
if (x == m) {
75+
private static final int NONE = 0;
76+
private static final int INTROVERT = 1;
77+
private static final int EXTROVERT = 2;
78+
79+
private int maxHappiness(
80+
int index,
81+
int m,
82+
int n,
83+
int introverts,
84+
int extroverts,
85+
int board,
86+
int[][][][] dp,
87+
int tmask) {
88+
if (index >= m * n) {
9389
return 0;
94-
} else if (y == n) {
95-
return dfs(x + 1, 0, ic, ec, state);
9690
}
97-
if (dp[x][y][ic][ec][state] != 0) {
98-
return dp[x][y][ic][ec][state];
91+
if (dp[index][introverts][extroverts][board] != 0) {
92+
return dp[index][introverts][extroverts][board];
9993
}
100-
// 1 - not place
101-
int max = dfs(x, y + 1, ic, ec, (state % mod) * 3);
102-
int up = state / mod;
103-
int left = state % 3;
104-
// 2 - place intro
105-
if (ic > 0) {
106-
int temp = 120;
107-
if (x > 0 && up != notPlace) {
108-
temp -= 30;
109-
temp += up == intro ? -30 : 20;
110-
}
111-
if (y > 0 && left != notPlace) {
112-
temp -= 30;
113-
temp += left == intro ? -30 : 20;
114-
}
115-
int nextState = state;
116-
nextState %= mod;
117-
nextState *= 3;
118-
nextState += intro;
119-
max = Math.max(max, temp + dfs(x, y + 1, ic - 1, ec, nextState));
94+
int introScore = -1;
95+
int extroScore = -1;
96+
if (introverts > 0) {
97+
int newBoard = ((board << 2) | INTROVERT) & tmask;
98+
introScore =
99+
120
100+
+ adjust(board, INTROVERT, n, index)
101+
+ maxHappiness(
102+
index + 1,
103+
m,
104+
n,
105+
introverts - 1,
106+
extroverts,
107+
newBoard,
108+
dp,
109+
tmask);
110+
}
111+
if (extroverts > 0) {
112+
int newBoard = ((board << 2) | EXTROVERT) & tmask;
113+
extroScore =
114+
40
115+
+ adjust(board, EXTROVERT, n, index)
116+
+ maxHappiness(
117+
index + 1,
118+
m,
119+
n,
120+
introverts,
121+
extroverts - 1,
122+
newBoard,
123+
dp,
124+
tmask);
120125
}
121-
// 3 - place extro
122-
if (ec > 0) {
123-
int temp = 40;
124-
if (x > 0 && up != notPlace) {
125-
temp += 20;
126-
temp += up == intro ? -30 : 20;
126+
int newBoard = ((board << 2) | NONE) & tmask;
127+
int skip = maxHappiness(index + 1, m, n, introverts, extroverts, newBoard, dp, tmask);
128+
dp[index][introverts][extroverts][board] = Math.max(skip, Math.max(introScore, extroScore));
129+
return dp[index][introverts][extroverts][board];
130+
}
131+
132+
private int adjust(int board, int thisIs, int col, int index) {
133+
int shiftBy = 2 * (col - 1);
134+
int left = board & 0x03;
135+
if (index % col == 0) {
136+
left = NONE;
137+
}
138+
int up = (board >> shiftBy) & 0x03;
139+
int[] combination = new int[] {left, up};
140+
int adjustment = 0;
141+
for (int neighbor : combination) {
142+
if (neighbor == NONE) {
143+
continue;
127144
}
128-
if (y > 0 && left != notPlace) {
129-
temp += 20;
130-
temp += left == intro ? -30 : 20;
145+
if (neighbor == INTROVERT && thisIs == INTROVERT) {
146+
adjustment -= 60;
147+
} else if (neighbor == INTROVERT && thisIs == EXTROVERT) {
148+
adjustment -= 10;
149+
} else if (neighbor == EXTROVERT && thisIs == INTROVERT) {
150+
adjustment -= 10;
151+
} else if (neighbor == EXTROVERT && thisIs == EXTROVERT) {
152+
adjustment += 40;
131153
}
132-
int nextState = state;
133-
nextState %= mod;
134-
nextState *= 3;
135-
nextState += extro;
136-
max = Math.max(max, temp + dfs(x, y + 1, ic, ec - 1, nextState));
137154
}
138-
dp[x][y][ic][ec][state] = max;
139-
return max;
155+
return adjustment;
156+
}
157+
158+
public int getMaxGridHappiness(int m, int n, int introvertsCount, int extrovertsCount) {
159+
int[][][][] dp = new int[m * n][introvertsCount + 1][extrovertsCount + 1][(1 << (2 * n))];
160+
int tmask = (1 << (2 * n)) - 1;
161+
return maxHappiness(0, m, n, introvertsCount, extrovertsCount, 0, dp, tmask);
140162
}
141163
}
142164
```

src/main/java/g3401_3500/s3435_frequencies_of_shortest_supersequences/readme.md

Lines changed: 79 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -58,106 +58,110 @@ The two SCSs are `"aac"` and `"aca"`. Since they are permutations of each other,
5858

5959
```java
6060
import java.util.ArrayList;
61-
import java.util.Arrays;
62-
import java.util.HashSet;
6361
import java.util.List;
64-
import java.util.Set;
6562

63+
@SuppressWarnings("unchecked")
6664
public class Solution {
67-
private int m;
68-
private int forcedMask;
69-
private int[] adj;
70-
private char[] idxToChar = new char[26];
71-
private int[] charToIdx = new int[26];
72-
private boolean[] used = new boolean[26];
65+
private int min = Integer.MAX_VALUE;
66+
private List<int[]> lists = new ArrayList<>();
7367

7468
public List<List<Integer>> supersequences(String[] words) {
75-
Arrays.fill(charToIdx, -1);
76-
for (String w : words) {
77-
used[w.charAt(0) - 'a'] = true;
78-
used[w.charAt(1) - 'a'] = true;
69+
boolean[][] pairs = new boolean[26][26];
70+
int[] counts = new int[26];
71+
for (String word : words) {
72+
int a = word.charAt(0) - 'a';
73+
int b = word.charAt(1) - 'a';
74+
if (!pairs[a][b]) {
75+
pairs[a][b] = true;
76+
counts[a]++;
77+
counts[b]++;
78+
}
79+
}
80+
List<Integer>[] links = new ArrayList[26];
81+
for (int i = 0; i < 26; i++) {
82+
links[i] = new ArrayList<>();
7983
}
80-
// Map each used letter to an index [0..m-1]
81-
for (int c = 0; c < 26; c++) {
82-
if (used[c]) {
83-
idxToChar[m] = (char) (c + 'a');
84-
charToIdx[c] = m++;
84+
int[] counts1 = new int[26];
85+
int[] sides = new int[26];
86+
for (int i = 0; i < 26; i++) {
87+
for (int j = 0; j < 26; j++) {
88+
if (pairs[i][j]) {
89+
links[i].add(j);
90+
counts1[j]++;
91+
sides[i] |= 1;
92+
sides[j] |= 2;
93+
}
8594
}
8695
}
87-
adj = new int[m];
88-
// Build graph and record forced duplicates
89-
for (String w : words) {
90-
int u = charToIdx[w.charAt(0) - 'a'];
91-
int v = charToIdx[w.charAt(1) - 'a'];
92-
if (u == v) {
93-
forcedMask |= (1 << u);
96+
int[] arr = new int[26];
97+
for (int i = 0; i < 26; i++) {
98+
if (counts[i] <= 1) {
99+
arr[i] = counts[i];
100+
} else if (counts1[i] == 0 || sides[i] != 3) {
101+
arr[i] = 1;
102+
} else if (pairs[i][i]) {
103+
arr[i] = 2;
94104
} else {
95-
adj[u] |= (1 << v);
105+
arr[i] = -1;
96106
}
97107
}
98-
// Try all supersets of forcedMask; keep those that kill all cycles
99-
int best = 9999;
100-
List<Integer> goodSets = new ArrayList<>();
101-
for (int s = 0; s < (1 << m); s++) {
102-
if ((s & forcedMask) != forcedMask) {
103-
continue;
104-
}
105-
int size = Integer.bitCount(s);
106-
if (size <= best && !hasCycle(s)) {
107-
if (size < best) {
108-
best = size;
109-
goodSets.clear();
110-
}
111-
goodSets.add(s);
108+
dfs(links, 0, arr, new int[26], 0);
109+
List<List<Integer>> res = new ArrayList<>();
110+
for (int[] arr1 : lists) {
111+
List<Integer> list = new ArrayList<>();
112+
for (int n : arr1) {
113+
list.add(n);
112114
}
115+
res.add(list);
116+
}
117+
return res;
118+
}
119+
120+
private void dfs(List<Integer>[] links, int i, int[] arr1, int[] arr, int n) {
121+
if (n > min) {
122+
return;
113123
}
114-
// Build distinct freq arrays from these sets
115-
Set<String> seen = new HashSet<>();
116-
List<List<Integer>> ans = new ArrayList<>();
117-
for (int s : goodSets) {
118-
int[] freq = new int[26];
119-
for (int i = 0; i < m; i++) {
120-
freq[idxToChar[i] - 'a'] = ((s & (1 << i)) != 0) ? 2 : 1;
124+
if (i == 26) {
125+
if (!chk(links, arr)) {
126+
return;
121127
}
122-
String key = Arrays.toString(freq);
123-
if (seen.add(key)) {
124-
List<Integer> tmp = new ArrayList<>();
125-
for (int f : freq) {
126-
tmp.add(f);
127-
}
128-
ans.add(tmp);
128+
if (n < min) {
129+
min = n;
130+
lists = new ArrayList<>();
131+
lists.add(arr.clone());
132+
} else if (n == min) {
133+
lists.add(arr.clone());
129134
}
135+
return;
136+
}
137+
if (arr1[i] >= 0) {
138+
arr[i] = arr1[i];
139+
dfs(links, i + 1, arr1, arr, n + arr1[i]);
140+
} else {
141+
arr[i] = 1;
142+
dfs(links, i + 1, arr1, arr, n + 1);
143+
arr[i] = 2;
144+
dfs(links, i + 1, arr1, arr, n + 2);
130145
}
131-
return ans;
132146
}
133147

134-
private boolean hasCycle(int mask) {
135-
int[] color = new int[m];
136-
for (int i = 0; i < m; i++) {
137-
if (((mask >> i) & 1) == 0 && color[i] == 0 && dfs(i, color, mask)) {
138-
return true;
148+
private boolean chk(List<Integer>[] links, int[] arr) {
149+
for (int i = 0; i < 26; i++) {
150+
if (arr[i] == 1 && dfs1(links, arr, new boolean[26], i)) {
151+
return false;
139152
}
140153
}
141-
return false;
154+
return true;
142155
}
143156

144-
private boolean dfs(int u, int[] color, int mask) {
145-
color[u] = 1;
146-
int nxt = adj[u];
147-
while (nxt != 0) {
148-
int v = Integer.numberOfTrailingZeros(nxt);
149-
nxt &= (nxt - 1);
150-
if (((mask >> v) & 1) == 1) {
151-
continue;
152-
}
153-
if (color[v] == 1) {
154-
return true;
155-
}
156-
if (color[v] == 0 && dfs(v, color, mask)) {
157+
private boolean dfs1(List<Integer>[] links, int[] arr, boolean[] seens, int i) {
158+
seens[i] = true;
159+
for (int next : links[i]) {
160+
if (arr[next] == 1 && (seens[next] || dfs1(links, arr, seens, next))) {
157161
return true;
158162
}
159163
}
160-
color[u] = 2;
164+
seens[i] = false;
161165
return false;
162166
}
163167
}

src/main/java/g3401_3500/s3457_eat_pizzas/readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ The total weight gained after eating all the pizzas is `2 + 1 = 3.`
4949
## Solution
5050

5151
```java
52-
class Solution {
52+
public class Solution {
5353
public long maxWeight(int[] pizzas) {
5454
int max = 0;
5555
for (int x : pizzas) {

0 commit comments

Comments
 (0)