Skip to content

Commit 17af234

Browse files
committed
Improved tasks 3360-3373
1 parent 4fd65cb commit 17af234

File tree

12 files changed

+249
-198
lines changed

12 files changed

+249
-198
lines changed

src/main/java/g3301_3400/s3360_stone_removal_game/Solution.java

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

3-
// #Easy #2024_11_24_Time_0_ms_(100.00%)_Space_40.5_MB_(100.00%)
3+
// #Easy #Math #Simulation #2024_12_03_Time_0_ms_(100.00%)_Space_40.3_MB_(80.86%)
44

55
public class Solution {
66
public boolean canAliceWin(int n) {
Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,36 @@
11
package g3301_3400.s3361_shift_distance_between_two_strings;
22

3-
// #Medium #2024_11_24_Time_57_ms_(100.00%)_Space_45.7_MB_(100.00%)
3+
// #Medium #Array #String #Prefix_Sum #2024_12_03_Time_9_ms_(100.00%)_Space_45.8_MB_(36.02%)
44

55
public class Solution {
66
public long shiftDistance(String s, String t, int[] nextCost, int[] previousCost) {
7-
long sum = 0;
8-
int n = s.length();
9-
for (int i = 0; i < n; i++) {
10-
int ch1 = s.charAt(i) - 'a';
11-
int ch2 = t.charAt(i) - 'a';
12-
int forwardDiff = (ch2 - ch1 + 26) % 26;
13-
long forwardCost = 0;
14-
for (int j = 0; j < forwardDiff; j++) {
15-
forwardCost += nextCost[(ch1 + j) % 26];
7+
long[][] costs = new long[26][26];
8+
long cost;
9+
for (int i = 0; i < 26; i++) {
10+
cost = nextCost[i];
11+
for (int j = (i == 25 ? 0 : i + 1); j != i; j++) {
12+
costs[i][j] = cost;
13+
cost += nextCost[j];
14+
if (j == 25) {
15+
j = -1;
16+
}
1617
}
17-
int reverseDiff = (26 + ch1 - ch2) % 26;
18-
long backwardCost = 0;
19-
for (int j = 0; j < reverseDiff; j++) {
20-
backwardCost += previousCost[(ch1 - j + 26) % 26];
18+
}
19+
for (int i = 0; i < 26; i++) {
20+
cost = previousCost[i];
21+
for (int j = (i == 0 ? 25 : i - 1); j != i; j--) {
22+
costs[i][j] = Math.min(costs[i][j], cost);
23+
cost += previousCost[j];
24+
if (j == 0) {
25+
j = 26;
26+
}
2127
}
22-
sum += Math.min(forwardCost, backwardCost);
2328
}
24-
return sum;
29+
int n = s.length();
30+
long ans = 0;
31+
for (int i = 0; i < n; i++) {
32+
ans += costs[s.charAt(i) - 'a'][t.charAt(i) - 'a'];
33+
}
34+
return ans;
2535
}
2636
}

src/main/java/g3301_3400/s3362_zero_array_transformation_iii/Solution.java

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

3-
// #Medium #2024_11_24_Time_67_ms_(100.00%)_Space_89.9_MB_(66.67%)
3+
// #Medium #Array #Sorting #Greedy #Heap_Priority_Queue #Prefix_Sum
4+
// #2024_12_03_Time_68_ms_(91.99%)_Space_93.6_MB_(45.88%)
45

56
import java.util.Arrays;
67
import java.util.PriorityQueue;

src/main/java/g3301_3400/s3363_find_the_maximum_number_of_fruits_collected/Solution.java

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

3-
// #Hard #2024_11_24_Time_13_ms_(100.00%)_Space_142.3_MB_(33.33%)
3+
// #Hard #Array #Dynamic_Programming #Matrix #2024_12_03_Time_12_ms_(91.34%)_Space_142.1_MB_(88.96%)
44

55
public class Solution {
66
public int maxCollectedFruits(int[][] fruits) {
Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
package g3301_3400.s3364_minimum_positive_sum_subarray;
22

3-
// #Easy #2024_11_24_Time_28_ms_(100.00%)_Space_44.7_MB_(100.00%)
3+
// #Easy #Array #Prefix_Sum #Sliding_Window #2024_12_03_Time_1_ms_(100.00%)_Space_44.5_MB_(38.75%)
44

55
import java.util.List;
66

77
public class Solution {
8-
public int minimumSumSubarray(List<Integer> nums, int l, int r) {
9-
int size = nums.size();
10-
int res = -1;
11-
for (int s = l; s <= r; s++) {
12-
for (int i = 0; i <= size - s; i++) {
13-
int sum = 0;
14-
for (int j = i; j < i + s; j++) {
15-
sum += nums.get(j);
16-
}
17-
if (sum > 0 && (res == -1 || res > sum)) {
18-
res = sum;
8+
public int minimumSumSubarray(List<Integer> li, int l, int r) {
9+
int n = li.size();
10+
int min = Integer.MAX_VALUE;
11+
int[] a = new int[n + 1];
12+
for (int i = 1; i <= n; i++) {
13+
a[i] = a[i - 1] + li.get(i - 1);
14+
}
15+
for (int size = l; size <= r; size++) {
16+
for (int i = size - 1; i < n; i++) {
17+
int sum = a[i + 1] - a[i + 1 - size];
18+
if (sum > 0) {
19+
min = Math.min(min, sum);
1920
}
2021
}
2122
}
22-
return res;
23+
return min == Integer.MAX_VALUE ? -1 : min;
2324
}
2425
}

src/main/java/g3301_3400/s3365_rearrange_k_substrings_to_form_target_string/Solution.java

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

3-
// #Medium #2024_11_24_Time_61_ms_(100.00%)_Space_49.3_MB_(100.00%)
3+
// #Medium #String #Hash_Table #Sorting #2024_12_03_Time_59_ms_(94.24%)_Space_49.2_MB_(97.33%)
44

55
import java.util.HashMap;
66
import java.util.Map;
Lines changed: 62 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,75 @@
11
package g3301_3400.s3366_minimum_array_sum;
22

3-
// #Medium #2024_11_24_Time_66_ms_(100.00%)_Space_55_MB_(100.00%)
3+
// #Medium #Array #Dynamic_Programming #2024_12_03_Time_4_ms_(99.77%)_Space_43_MB_(99.69%)
4+
5+
import java.util.Arrays;
6+
import java.util.HashMap;
7+
import java.util.Map;
48

59
public class Solution {
610
public int minArraySum(int[] nums, int k, int op1, int op2) {
7-
Integer[][][] dp = new Integer[nums.length][op1 + 1][op2 + 1];
8-
return sub(dp, nums, 0, k, op1, op2);
9-
}
10-
11-
private int sub(Integer[][][] dp, int[] nums, int i, int k, int op1, int op2) {
12-
if (i == nums.length) {
13-
return 0;
14-
}
15-
if (dp[i][op1][op2] != null) {
16-
return dp[i][op1][op2];
11+
Arrays.sort(nums);
12+
int high = lowerBound(nums, k * 2 - 1);
13+
int low = lowerBound(nums, k);
14+
int n = nums.length;
15+
for (int i = n - 1; i >= high; i--) {
16+
if (op1 > 0) {
17+
nums[i] = (nums[i] + 1) / 2;
18+
op1--;
19+
}
20+
if (op2 > 0) {
21+
nums[i] -= k;
22+
op2--;
23+
}
1724
}
18-
int res = sub(dp, nums, i + 1, k, op1, op2) + nums[i];
19-
if (nums[i] >= k && op2 > 0) {
20-
res = Math.min(res, sub(dp, nums, i + 1, k, op1, op2 - 1) + nums[i] - k);
21-
int v = (int) Math.ceil(nums[i] / 2.0);
22-
if (v < k) {
23-
v = (int) Math.ceil((nums[i] - k) / 2.0);
25+
Map<Integer, Integer> count = new HashMap<>();
26+
int odd = 0;
27+
for (int i = low; i < high; i++) {
28+
if (op2 > 0) {
29+
nums[i] -= k;
30+
if (k % 2 > 0 && nums[i] % 2 > 0) {
31+
count.merge(nums[i], 1, Integer::sum);
32+
}
33+
op2--;
2434
} else {
25-
v -= k;
35+
odd += nums[i] % 2;
2636
}
27-
if (op1 > 0) {
28-
res = Math.min(res, sub(dp, nums, i + 1, k, op1 - 1, op2 - 1) + v);
37+
}
38+
Arrays.sort(nums, 0, high);
39+
int ans = 0;
40+
if (k % 2 > 0) {
41+
for (int i = high - op1; i < high && odd > 0; i++) {
42+
int x = nums[i];
43+
if (count.containsKey(x)) {
44+
if (count.merge(x, -1, Integer::sum) == 0) {
45+
count.remove(x);
46+
}
47+
odd--;
48+
ans--;
49+
}
2950
}
3051
}
31-
if (op1 > 0) {
32-
int v = (int) Math.ceil(nums[i] / 2.0);
33-
res = Math.min(res, sub(dp, nums, i + 1, k, op1 - 1, op2) + v);
52+
for (int i = high - 1; i >= 0 && op1 > 0; i--) {
53+
nums[i] = (nums[i] + 1) / 2;
54+
op1--;
55+
}
56+
for (int x : nums) {
57+
ans += x;
58+
}
59+
return ans;
60+
}
61+
62+
private int lowerBound(int[] nums, int target) {
63+
int left = -1;
64+
int right = nums.length;
65+
while (left + 1 < right) {
66+
int mid = (left + right) >>> 1;
67+
if (nums[mid] >= target) {
68+
right = mid;
69+
} else {
70+
left = mid;
71+
}
3472
}
35-
dp[i][op1][op2] = res;
36-
return res;
73+
return right;
3774
}
3875
}

src/main/java/g3301_3400/s3367_maximize_sum_of_weights_after_edge_removals/Solution.java

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

3-
// #Hard #2024_11_27_Time_87_ms_(98.35%)_Space_152.7_MB_(18.13%)
3+
// #Hard #Dynamic_Programming #Tree #Depth_First_Search
4+
// #2024_12_03_Time_104_ms_(91.49%)_Space_147.1_MB_(58.51%)
45

56
import java.util.ArrayList;
67
import java.util.List;

src/main/java/g3301_3400/s3370_smallest_number_with_all_set_bits/Solution.java

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

3-
// #Easy #2024_12_01_Time_0_ms_(100.00%)_Space_40.7_MB_(100.00%)
3+
// #Easy #Math #Bit_Manipulation #2024_12_03_Time_0_ms_(100.00%)_Space_41.1_MB_(45.50%)
44

55
public class Solution {
66
public int smallestNumber(int n) {
Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
11
package g3301_3400.s3371_identify_the_largest_outlier_in_an_array;
22

3-
// #Medium #2024_12_01_Time_633_ms_(100.00%)_Space_64.5_MB_(100.00%)
4-
5-
import java.util.TreeMap;
3+
// #Medium #Array #Hash_Table #Counting #Enumeration
4+
// #2024_12_03_Time_5_ms_(100.00%)_Space_60.6_MB_(33.40%)
65

76
public class Solution {
87
public int getLargestOutlier(int[] nums) {
8+
int[] cnt = new int[2001];
99
int sum = 0;
10-
for (int num : nums) {
11-
sum += num;
12-
}
13-
TreeMap<Integer, Integer> frequencyMap = new TreeMap<>();
14-
for (int num : nums) {
15-
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
10+
for (int i : nums) {
11+
sum += i;
12+
cnt[i + 1000]++;
1613
}
17-
int ans = Integer.MIN_VALUE;
18-
for (int num : nums) {
19-
if ((sum - num) % 2 == 0) {
20-
int target = (sum - num) / 2;
21-
frequencyMap.put(num, frequencyMap.get(num) - 1);
22-
if (frequencyMap.get(num) == 0) {
23-
frequencyMap.remove(num);
24-
}
25-
if (frequencyMap.containsKey(target)) {
26-
ans = Math.max(ans, num);
27-
}
28-
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
14+
for (int i = cnt.length - 1; i >= 0; --i) {
15+
int j = i - 1000;
16+
if (cnt[i] == 0) {
17+
continue;
18+
}
19+
sum -= j;
20+
int csum = (sum >> 1) + 1000;
21+
cnt[i]--;
22+
if (sum % 2 == 0 && csum >= 0 && csum < cnt.length && cnt[csum] > 0) {
23+
return j;
2924
}
25+
sum += j;
26+
cnt[i]++;
3027
}
31-
return ans == Integer.MIN_VALUE ? -1 : ans;
28+
return 0;
3229
}
3330
}

0 commit comments

Comments
 (0)