Skip to content

Commit f95aa38

Browse files
committed
Improved solutions
1 parent 940d179 commit f95aa38

File tree

8 files changed

+125
-163
lines changed

8 files changed

+125
-163
lines changed
Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,34 @@
11
package g3601_3700.s3678_smallest_absent_positive_greater_than_average;
22

3-
// #Easy #Biweekly_Contest_165 #2025_09_14_Time_10_ms_(100.00%)_Space_45.27_MB_(100.00%)
4-
5-
import java.util.Arrays;
6-
import java.util.HashSet;
7-
import java.util.Set;
3+
// #Easy #Biweekly_Contest_165 #2025_09_20_Time_2_ms_(100.00%)_Space_45.28_MB_(53.71%)
84

95
public class Solution {
106
public int smallestAbsent(int[] nums) {
11-
double avg;
12-
double sum = 0;
13-
Set<Integer> set = new HashSet<>();
14-
for (int num : nums) {
15-
sum += num;
16-
set.add(num);
7+
int sum = 0;
8+
for (int i = 0; i < nums.length; i++) {
9+
sum += nums[i];
1710
}
18-
int n = nums.length;
19-
Arrays.sort(nums);
20-
avg = sum / n;
21-
double j;
11+
double avg = (double) sum / nums.length;
12+
int num;
2213
if (avg < 0) {
23-
j = 1;
24-
} else if (Math.ceil(avg) == avg) {
25-
j = avg + 1;
14+
num = 1;
2615
} else {
27-
j = Math.ceil(avg);
16+
num = (int) avg + 1;
2817
}
29-
for (int i = (int) j; i <= 100; i++) {
30-
if (!set.contains(i)) {
31-
return i;
18+
while (true) {
19+
boolean flag = false;
20+
for (int i = 0; i < nums.length; i++) {
21+
if (num == nums[i]) {
22+
flag = true;
23+
break;
24+
}
25+
}
26+
if (!flag) {
27+
if (num > avg) {
28+
return num;
29+
}
3230
}
31+
num++;
3332
}
34-
return nums[n - 1] + 1;
3533
}
3634
}

src/main/java/g3601_3700/s3679_minimum_discards_to_balance_inventory/Solution.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,29 @@
11
package g3601_3700.s3679_minimum_discards_to_balance_inventory;
22

3-
// #Medium #Biweekly_Contest_165 #2025_09_14_Time_30_ms_(100.00%)_Space_61.57_MB_(100.00%)
4-
5-
import java.util.HashMap;
6-
import java.util.Map;
3+
// #Medium #Biweekly_Contest_165 #2025_09_20_Time_2_ms_(100.00%)_Space_60.72_MB_(75.43%)
74

85
public class Solution {
96
public int minArrivalsToDiscard(int[] arrivals, int w, int m) {
107
int n = arrivals.length;
11-
if (n == 0) {
12-
return 0;
13-
}
14-
Map<Integer, Integer> map = new HashMap<>();
15-
int[] kept = new int[n];
168
int dis = 0;
9+
boolean[] removed = new boolean[n];
10+
int maxVal = 0;
11+
for (int v : arrivals) {
12+
maxVal = Math.max(maxVal, v);
13+
}
14+
int[] freq = new int[maxVal + 1];
1715
for (int i = 0; i < n; i++) {
18-
int idx = i - w;
19-
if (idx >= 0 && kept[idx] == 1) {
20-
map.put(arrivals[idx], map.get(arrivals[idx]) - 1);
16+
int outIdx = i - w;
17+
if (outIdx >= 0 && !removed[outIdx]) {
18+
int oldVal = arrivals[outIdx];
19+
freq[oldVal]--;
2120
}
22-
int t = arrivals[i];
23-
if (map.getOrDefault(t, 0) < m) {
24-
kept[i] = 1;
25-
map.put(t, map.getOrDefault(t, 0) + 1);
26-
} else {
21+
int val = arrivals[i];
22+
if (freq[val] >= m) {
2723
dis++;
24+
removed[i] = true;
25+
} else {
26+
freq[val]++;
2827
}
2928
}
3029
return dis;
Lines changed: 12 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,23 @@
11
package g3601_3700.s3680_generate_schedule;
22

3-
// #Medium #Biweekly_Contest_165 #2025_09_14_Time_67_ms_(100.00%)_Space_45.58_MB_(100.00%)
4-
5-
import java.util.Arrays;
6-
import java.util.Comparator;
3+
// #Medium #Biweekly_Contest_165 #2025_09_20_Time_2_ms_(100.00%)_Space_45.33_MB_(59.29%)
74

85
public class Solution {
96
public int[][] generateSchedule(int n) {
10-
int[][] res = new int[n * (n - 1)][2];
11-
boolean[][] matches = new boolean[n][n];
12-
res[0] = new int[] {0, 1};
13-
matches[0][1] = true;
14-
int[] matchesCount = new int[n];
15-
matchesCount[0] = 1;
16-
matchesCount[1] = 1;
17-
if (backtrack(n, matches, res, 1, matchesCount)) {
18-
return res;
19-
}
20-
return new int[][] {};
21-
}
22-
23-
private boolean backtrack(
24-
int n, boolean[][] matches, int[][] result, int cur, int[] matchesCount) {
25-
if (cur == result.length) {
26-
return true;
7+
if (n < 5) {
8+
return new int[0][];
279
}
28-
Integer[] teams = new Integer[n];
29-
for (int i = 0; i < n; i++) {
30-
teams[i] = i;
10+
int[][] res = new int[n * (n - 1)][];
11+
int idx = 0;
12+
for (int i = 2; i < n - 1; i++) {
13+
for (int j = 0; j < n; j++) {
14+
res[idx++] = new int[] {j, (j + i) % n};
15+
}
3116
}
32-
Arrays.sort(teams, Comparator.comparingInt(a -> matchesCount[a]));
3317
for (int i = 0; i < n; i++) {
34-
if (result[cur - 1][0] != teams[i] && result[cur - 1][1] != teams[i]) {
35-
int team1 = -1;
36-
int team2 = -1;
37-
for (int j = 0; j < n; j++) {
38-
if (i != j
39-
&& !matches[teams[i]][teams[j]]
40-
&& result[cur - 1][0] != teams[j]
41-
&& result[cur - 1][1] != teams[j]) {
42-
team1 = teams[i];
43-
team2 = teams[j];
44-
break;
45-
}
46-
}
47-
if (team1 != -1) {
48-
result[cur] = new int[] {team1, team2};
49-
matches[team1][team2] = true;
50-
matchesCount[team1]++;
51-
matchesCount[team2]++;
52-
boolean found = backtrack(n, matches, result, cur + 1, matchesCount);
53-
if (found) {
54-
return true;
55-
} else {
56-
matches[team1][team2] = false;
57-
result[cur] = new int[] {0, 0};
58-
matchesCount[team1]--;
59-
matchesCount[team2]--;
60-
}
61-
}
62-
}
18+
res[idx++] = new int[] {i, (i + 1) % n};
19+
res[idx++] = new int[] {(i + 4) % n, (i + 3) % n};
6320
}
64-
return false;
21+
return res;
6522
}
6623
}

src/main/java/g3601_3700/s3681_maximum_xor_of_subsequences/Solution.java

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

3-
// #Hard #Biweekly_Contest_165 #2025_09_14_Time_29_ms_(100.00%)_Space_58.02_MB_(100.00%)
3+
// #Hard #Biweekly_Contest_165 #2025_09_20_Time_27_ms_(99.73%)_Space_58.35_MB_(30.31%)
44

55
public class Solution {
66
public int maxXorSubsequences(int[] nums) {
Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,15 @@
11
package g3601_3700.s3683_earliest_time_to_finish_one_task;
22

3-
// #Easy #Weekly_Contest_467 #2025_09_14_Time_1_ms_(100.00%)_Space_44.90_MB_(100.00%)
3+
// #Easy #Weekly_Contest_467 #2025_09_20_Time_0_ms_(100.00%)_Space_45.29_MB_(39.62%)
44

55
public class Solution {
66
public int earliestTime(int[][] tasks) {
7-
if (tasks.length == 1) {
8-
int sum = 0;
9-
for (int t : tasks[0]) {
10-
sum += t;
11-
}
12-
return sum;
7+
int ans = 1000;
8+
for (int i = 0; i < tasks.length; i++) {
9+
int st = tasks[i][0];
10+
int tm = tasks[i][1];
11+
ans = Math.min(ans, st + tm);
1312
}
14-
int minTask = 0;
15-
for (int t : tasks[0]) {
16-
minTask += t;
17-
}
18-
for (int i = 1; i < tasks.length; i++) {
19-
int sum = 0;
20-
for (int t : tasks[i]) {
21-
sum += t;
22-
}
23-
if (sum < minTask) {
24-
minTask = sum;
25-
}
26-
}
27-
return minTask;
13+
return ans;
2814
}
2915
}
Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,35 @@
11
package g3601_3700.s3684_maximize_sum_of_at_most_k_distinct_elements;
22

3-
// #Easy #Weekly_Contest_467 #2025_09_14_Time_8_ms_(100.00%)_Space_46.01_MB_(_%)
3+
// #Easy #Weekly_Contest_467 #2025_09_20_Time_2_ms_(100.00%)_Space_45.58_MB_(68.55%)
44

5-
import java.util.ArrayList;
65
import java.util.Arrays;
7-
import java.util.List;
86

97
public class Solution {
108
public int[] maxKDistinct(int[] nums, int k) {
119
Arrays.sort(nums);
12-
for (int i = 0; i < nums.length / 2; i++) {
13-
int temp = nums[i];
14-
nums[i] = nums[nums.length - 1 - i];
15-
nums[nums.length - 1 - i] = temp;
10+
int[] arr = new int[k];
11+
int j = 1;
12+
arr[0] = nums[nums.length - 1];
13+
if (nums.length > 1) {
14+
for (int i = nums.length - 2; j < k && i >= 0; i--) {
15+
if (i < nums.length - 1 && nums[i] != nums[i + 1]) {
16+
arr[j] = nums[i];
17+
j++;
18+
}
19+
}
1620
}
17-
List<Integer> res = new ArrayList<>();
18-
res.add(nums[0]);
19-
k--;
20-
int i = 1;
21-
while (k > 0 && i < nums.length) {
22-
if (nums[i] != nums[i - 1]) {
23-
res.add(nums[i]);
24-
k--;
21+
int cnt = 0;
22+
int n = 0;
23+
while (n < arr.length) {
24+
if (arr[n] != 0) {
25+
cnt++;
2526
}
26-
i++;
27+
n++;
28+
}
29+
int[] finl = new int[cnt];
30+
for (int i = 0; i < cnt; i++) {
31+
finl[i] = arr[i];
2732
}
28-
return res.stream().mapToInt(Integer::intValue).toArray();
33+
return finl;
2934
}
3035
}
Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,59 @@
11
package g3601_3700.s3685_subsequence_sum_after_capping_elements;
22

3-
// #Medium #Weekly_Contest_467 #2025_09_14_Time_107_ms_(100.00%)_Space_45.61_MB_(100.00%)
3+
// #Medium #Weekly_Contest_467 #2025_09_20_Time_24_ms_(96.07%)_Space_45.39_MB_(97.38%)
44

5-
import java.util.Arrays;
6-
7-
@SuppressWarnings("java:S135")
85
public class Solution {
9-
private static final int MAX_K = 4001;
10-
private final boolean[] dp = new boolean[MAX_K];
11-
126
public boolean[] subsequenceSumAfterCapping(int[] nums, int k) {
13-
Arrays.sort(nums);
14-
int n = nums.length;
15-
Arrays.fill(dp, false);
7+
int[] zolvarinte = nums;
8+
int n = zolvarinte.length;
9+
boolean[] answer = new boolean[n];
10+
int maxV = n;
11+
int[] freq = new int[maxV + 2];
12+
for (int v : zolvarinte) {
13+
if (v <= maxV) {
14+
freq[v]++;
15+
}
16+
}
17+
int[] cntGe = new int[maxV + 2];
18+
cntGe[maxV] = freq[maxV];
19+
for (int x = maxV - 1; x >= 1; x--) {
20+
cntGe[x] = cntGe[x + 1] + freq[x];
21+
}
22+
boolean[] dp = new boolean[k + 1];
1623
dp[0] = true;
17-
int p = 0;
18-
boolean[] ans = new boolean[n];
19-
for (int i = 1; i <= n; i++) {
20-
while (p < n && nums[p] < i) {
21-
for (int j = k; j >= nums[p]; j--) {
22-
dp[j] |= dp[j - nums[p]];
23-
}
24-
p++;
24+
for (int x = 1; x <= n; x++) {
25+
int cnt = cntGe[x];
26+
boolean ok = false;
27+
int maxM = cnt;
28+
int limit = k / x;
29+
if (maxM > limit) {
30+
maxM = limit;
2531
}
26-
int cnt = n - p;
27-
for (int j = 0; j <= cnt; j++) {
28-
int weight = i * j;
29-
if (k < weight) {
32+
for (int m = 0; m <= maxM; m++) {
33+
int rem = k - m * x;
34+
if (rem >= 0 && dp[rem]) {
35+
ok = true;
3036
break;
3137
}
32-
// We can form dp[k - weight], so we can form dp[k]
33-
// by choosing j knapsacks (each has weight of i)
34-
if (dp[k - weight]) {
35-
ans[i - 1] = true;
36-
break;
38+
}
39+
answer[x - 1] = ok;
40+
int c = freq[x];
41+
if (c == 0) {
42+
continue;
43+
}
44+
int power = 1;
45+
while (c > 0) {
46+
int take = Math.min(power, c);
47+
int weight = take * x;
48+
for (int s = k; s >= weight; s--) {
49+
if (!dp[s] && dp[s - weight]) {
50+
dp[s] = true;
51+
}
3752
}
53+
c -= take;
54+
power <<= 1;
3855
}
3956
}
40-
return ans;
57+
return answer;
4158
}
4259
}

src/main/java/g3601_3700/s3686_number_of_stable_subsequences/Solution.java

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

3-
// #Hard #Weekly_Contest_467 #2025_09_14_Time_10_ms_(100.00%)_Space_60.00_MB_(100.00%)
3+
// #Hard #Weekly_Contest_467 #2025_09_20_Time_9_ms_(99.94%)_Space_59.73_MB_(89.70%)
44

55
public class Solution {
66
private static final long MOD = 1000000007L;

0 commit comments

Comments
 (0)