Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4c5231a

Browse files
committed
第436场周赛T1~T4 (4)
1 parent 06eca04 commit 4c5231a

File tree

8 files changed

+425
-0
lines changed

8 files changed

+425
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import java.util.ArrayList;
2+
import java.util.Comparator;
3+
import java.util.List;
4+
5+
public class Solution3446 {
6+
static class V1 {
7+
public int[][] sortMatrix(int[][] grid) {
8+
int n = grid.length;
9+
int[][] ans = new int[n][n];
10+
11+
// i=j+0
12+
// ...
13+
// i=j+n-1
14+
for (int d = 0; d < n; d++) {
15+
List<Integer> a = new ArrayList<>();
16+
for (int i = 0; i < n; i++) {
17+
int j = i - d;
18+
if (j < 0) continue;
19+
a.add(grid[i][j]);
20+
}
21+
a.sort(Comparator.reverseOrder());
22+
23+
int p = 0;
24+
for (int i = 0; i < n; i++) {
25+
int j = i - d;
26+
if (j < 0) continue;
27+
ans[i][j] = a.get(p++);
28+
}
29+
}
30+
31+
// 右上角三角形
32+
for (int d = 1; d < n; d++) {
33+
List<Integer> a = new ArrayList<>();
34+
for (int i = 0; i < n; i++) {
35+
int j = i + d;
36+
if (j >= n) continue;
37+
a.add(grid[i][j]);
38+
}
39+
a.sort(null);
40+
41+
int p = 0;
42+
for (int i = 0; i < n; i++) {
43+
int j = i + d;
44+
if (j >= n) continue;
45+
ans[i][j] = a.get(p++);
46+
}
47+
}
48+
return ans;
49+
}
50+
}
51+
52+
static class V2 {
53+
public int[][] sortMatrix(int[][] grid) {
54+
int m = grid.length;
55+
int n = grid[0].length;
56+
57+
// 令 k=i-j+n 那么右上角 k=1 左下角 k=m+n-1, j=i-k+n, i=k+j-n
58+
for (int k = 1; k < m + n; k++) {
59+
int min_j = Math.max(n - k, 0);
60+
int max_j = Math.min(m + m - 1 - k, n - 1);
61+
62+
List<Integer> a = new ArrayList<>();
63+
for (int j = min_j; j <= max_j; j++) {
64+
int i = k + j - n;
65+
a.add(grid[i][j]);
66+
}
67+
if (min_j == 0) a.sort(Comparator.reverseOrder());
68+
else a.sort(null);
69+
70+
int p = 0;
71+
for (int j = min_j; j <= max_j; j++) {
72+
int i = k + j - n;
73+
grid[i][j] = a.get(p++);
74+
}
75+
}
76+
return grid;
77+
}
78+
}
79+
}
80+
/*
81+
3446. 按对角线进行矩阵排序
82+
https://leetcode.cn/problems/sort-matrix-by-diagonals/description/
83+
84+
第 436 场周赛 T1。
85+
86+
给你一个大小为 n x n 的整数方阵 grid。返回一个经过如下调整的矩阵:
87+
- 左下角三角形(包括中间对角线)的对角线按 非递增顺序 排序。
88+
- 右上角三角形 的对角线按 非递减顺序 排序。
89+
提示:
90+
grid.length == grid[i].length == n
91+
1 <= n <= 10
92+
-10^5 <= grid[i][j] <= 10^5
93+
94+
找规律 / 遍历对角线
95+
时间复杂度 O(n^2 logn)。
96+
*/
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import java.util.Arrays;
2+
3+
public class Solution3447 {
4+
public int[] assignElements(int[] groups, int[] elements) {
5+
int n = groups.length;
6+
int m = elements.length;
7+
8+
int mx = (int) (1e5);
9+
int[] mp = new int[mx + 1];
10+
Arrays.fill(mp, -1);
11+
for (int j = 0; j < m; j++) {
12+
int v = elements[j];
13+
if (mp[v] != -1) continue;
14+
for (int e = v; e <= mx; e += v) {
15+
if (mp[e] == -1) {
16+
mp[e] = j;
17+
}
18+
}
19+
}
20+
21+
int[] ans = new int[n];
22+
for (int i = 0; i < n; i++) {
23+
ans[i] = mp[groups[i]];
24+
}
25+
return ans;
26+
}
27+
}
28+
/*
29+
3447. 将元素分配给有约束条件的组
30+
https://leetcode.cn/problems/assign-elements-to-groups-with-constraints/description/
31+
32+
第 436 场周赛 T2。
33+
34+
给你一个整数数组 groups,其中 groups[i] 表示第 i 组的大小。另给你一个整数数组 elements。
35+
请你根据以下规则为每个组分配 一个 元素:
36+
- 如果 groups[i] 能被 elements[j] 整除,则下标为 j 的元素可以分配给组 i。
37+
- 如果有多个元素满足条件,则分配 最小的下标 j 的元素。
38+
- 如果没有元素满足条件,则分配 -1 。
39+
返回一个整数数组 assigned,其中 assigned[i] 是分配给组 i 的元素的索引,若无合适的元素,则为 -1。
40+
注意:一个元素可以分配给多个组。
41+
提示:
42+
1 <= groups.length <= 10^5
43+
1 <= elements.length <= 10^5
44+
1 <= groups[i] <= 10^5
45+
1 <= elements[i] <= 10^5
46+
47+
调和级数枚举。
48+
时间复杂度 O(Ulogn + m)。
49+
*/
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
public class Solution3448 {
2+
static class V1 {
3+
public long countSubstrings(String s) {
4+
int n = s.length();
5+
long ans = 0;
6+
// f[i+1][m][rem] 表示以 si 结尾的、模 m 余数为 rem 的子串个数
7+
long[][][] f = new long[n + 1][10][10];
8+
for (int i = 0; i < n; i++) {
9+
int d = s.charAt(i) - '0'; // 以 v 结尾
10+
for (int m = 1; m <= 9; m++) {
11+
f[i + 1][m][d % m] += 1;
12+
for (int rem = 0; rem < m; rem++) {
13+
f[i + 1][m][(rem * 10 + d) % m] += f[i][m][rem];
14+
}
15+
}
16+
ans += f[i + 1][d][0];
17+
}
18+
return ans;
19+
}
20+
}
21+
22+
// 滚动数组优化
23+
static class V2 {
24+
public long countSubstrings(String s) {
25+
int n = s.length();
26+
long ans = 0;
27+
long[][] f = new long[10][10];
28+
for (int i = 0; i < n; i++) {
29+
int d = s.charAt(i) - '0'; // 以 v 结尾
30+
long[][] nf = new long[10][10];
31+
for (int m = 1; m <= 9; m++) {
32+
nf[m][d % m] += 1;
33+
for (int rem = 0; rem < m; rem++) {
34+
nf[m][(rem * 10 + d) % m] += f[m][rem];
35+
}
36+
}
37+
ans += nf[d][0];
38+
f = nf;
39+
}
40+
return ans;
41+
}
42+
}
43+
44+
static class V3 {
45+
public long countSubstrings(String s) {
46+
int n = s.length();
47+
long ans = 0;
48+
long[][] f = new long[10][10];
49+
for (int i = 0; i < n; i++) {
50+
int d = s.charAt(i) - '0'; // 以 v 结尾
51+
for (int m = 1; m <= 9; m++) {
52+
long[] nf = new long[10];
53+
nf[d % m] += 1;
54+
for (int rem = 0; rem < m; rem++) {
55+
nf[(rem * 10 + d) % m] += f[m][rem];
56+
}
57+
f[m] = nf;
58+
}
59+
ans += f[d][0];
60+
}
61+
return ans;
62+
}
63+
}
64+
}
65+
/*
66+
3448. 统计可以被最后一个数位整除的子字符串数目
67+
https://leetcode.cn/problems/count-substrings-divisible-by-last-digit/description/
68+
69+
第 436 场周赛 T3。
70+
71+
给你一个只包含数字的字符串 s 。
72+
请你返回 s 的最后一位 不是 0 的子字符串中,可以被子字符串最后一位整除的数目。
73+
子字符串 是一个字符串里面一段连续 非空 的字符序列。
74+
注意:子字符串可以有前导 0 。
75+
提示:
76+
1 <= s.length <= 10^5
77+
s 只包含数字。
78+
79+
定义 f[i+1][m][rem] 表示以 s[i] 结尾的,模 m 结果是 rem 的子串个数
80+
以 s[i-1] 结尾的子串,末位再添加上 s[i],就是以 s[i] 结尾的子串
81+
计算以 s[i] 结尾的模 m 的子串个数
82+
(rem_{i-1} * 10 + s[i]) % m
83+
以 s[i-1] 结尾的模 m 的余数为 rem 的子串的个数 = 50
84+
-> 以 s[i] 结尾的模 m 的余数为 (rem * 10 + s[i]) % m 的子串新增了 50 个
85+
写成代码就是 f[i+1][m][(rem * 10 + s[i]) % m] += f[i][m][rem]
86+
初始值 s[i] 单独形成一个子串,f[i+1][m][s[i]%m] = 1
87+
答案是什么?
88+
以 s[i] 结尾的模 s[i] 的余数为 0 的子串个数
89+
时间复杂度 O(n * D^2)。其中 D = 9
90+
rating 2378 (clist.by)
91+
*/
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
public class Solution3449 {
2+
private int[] points;
3+
private int m, n;
4+
5+
public long maxScore(int[] points, int m) {
6+
this.points = points;
7+
this.m = m;
8+
n = points.length;
9+
10+
long left = 0;
11+
long right = (long) 1e16;
12+
while (left < right) {
13+
long mid = left + (right - left) / 2;
14+
// 边界二分 F, F,..., F, [T, T,..., T]
15+
// ----------------------^
16+
if (!checkMid(mid)) {
17+
right = mid;
18+
} else {
19+
left = mid + 1;
20+
}
21+
}
22+
return left - 1;
23+
}
24+
25+
private boolean checkMid(long lim) {
26+
long[] A = new long[n];
27+
long step = 0;
28+
for (int i = 0; i < n; i++) {
29+
if (lim > A[i]) {
30+
// 第 i 个游戏需要继续加分
31+
// 在它和第 (i + 1) 个游戏之间反复移动
32+
long t = lim - A[i];
33+
t = (t + points[i] - 1) / points[i];
34+
step += t * 2 - 1;
35+
// 步数超出限制就即刻退出
36+
// 否则数据范围可能超出 long long
37+
if (step > m) return false;
38+
if (i + 1 < n) A[i + 1] += points[i + 1] * (t - 1);
39+
} else {
40+
// 第 i 个游戏不需要继续加分
41+
// 直接路过,但步数还要算
42+
// 这里步数可能会超过限制
43+
// 但是只要右边没有其它需要加分的游戏,就不会返回 false
44+
step++;
45+
}
46+
}
47+
return true;
48+
}
49+
}
50+
/*
51+
3449. 最大化游戏分数的最小值
52+
https://leetcode.cn/problems/maximize-the-minimum-game-score/description/
53+
54+
第 436 场周赛 T4。
55+
56+
给你一个长度为 n 的数组 points 和一个整数 m 。同时有另外一个长度为 n 的数组 gameScore ,其中 gameScore[i] 表示第 i 个游戏得到的分数。一开始对于所有的 i 都有 gameScore[i] == 0 。
57+
你开始于下标 -1 处,该下标在数组以外(在下标 0 前面一个位置)。你可以执行 至多 m 次操作,每一次操作中,你可以执行以下两个操作之一:
58+
- 将下标增加 1 ,同时将 points[i] 添加到 gameScore[i] 。
59+
- 将下标减少 1 ,同时将 points[i] 添加到 gameScore[i] 。
60+
注意,在第一次移动以后,下标必须始终保持在数组范围以内。
61+
请你返回 至多 m 次操作以后,gameScore 里面最小值 最大 为多少。
62+
提示:
63+
2 <= n == points.length <= 5 * 10^4
64+
1 <= points[i] <= 10^6
65+
1 <= m <= 10^9
66+
67+
二分答案 + 贪心。
68+
https://leetcode.cn/problems/maximize-the-minimum-game-score/solutions/3068716/er-fen-tan-xin-han-tan-xin-de-zheng-ming-nr32/
69+
时间复杂度 O(nlogU)。
70+
rating 2754 (clist.by)
71+
*/
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution3446Tests {
5+
private final Solution3446.V1 solution3446_v1 = new Solution3446.V1();
6+
private final Solution3446.V2 solution3446_v2 = new Solution3446.V2();
7+
8+
@Test
9+
public void example1() {
10+
int[][] grid = UtUtils.stringToInts2("[[1,7,3],[9,8,2],[4,5,6]]");
11+
int[][] expected = UtUtils.stringToInts2("[[8,2,3],[9,6,7],[4,5,1]]");
12+
Assertions.assertArrayEquals(expected, solution3446_v1.sortMatrix(grid));
13+
Assertions.assertArrayEquals(expected, solution3446_v2.sortMatrix(grid));
14+
}
15+
16+
@Test
17+
public void example2() {
18+
int[][] grid = UtUtils.stringToInts2("[[0,1],[1,2]]");
19+
int[][] expected = UtUtils.stringToInts2("[[2,1],[1,0]]");
20+
Assertions.assertArrayEquals(expected, solution3446_v1.sortMatrix(grid));
21+
Assertions.assertArrayEquals(expected, solution3446_v2.sortMatrix(grid));
22+
}
23+
24+
@Test
25+
public void example3() {
26+
int[][] grid = UtUtils.stringToInts2("[[1]]");
27+
int[][] expected = UtUtils.stringToInts2("[[1]]");
28+
Assertions.assertArrayEquals(expected, solution3446_v1.sortMatrix(grid));
29+
Assertions.assertArrayEquals(expected, solution3446_v2.sortMatrix(grid));
30+
}
31+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution3447Tests {
5+
private final Solution3447 solution3447 = new Solution3447();
6+
7+
@Test
8+
public void example1() {
9+
int[] groups = {8, 4, 3, 2, 4};
10+
int[] elements = {4, 2};
11+
int[] expected = {0, 0, -1, 1, 0};
12+
Assertions.assertArrayEquals(expected, solution3447.assignElements(groups, elements));
13+
}
14+
15+
@Test
16+
public void example2() {
17+
int[] groups = {2, 3, 5, 7};
18+
int[] elements = {5, 3, 3};
19+
int[] expected = {-1, 1, 0, -1};
20+
Assertions.assertArrayEquals(expected, solution3447.assignElements(groups, elements));
21+
}
22+
23+
@Test
24+
public void example3() {
25+
int[] groups = {10, 21, 30, 41};
26+
int[] elements = {2, 1};
27+
int[] expected = {0, 1, 0, 1};
28+
Assertions.assertArrayEquals(expected, solution3447.assignElements(groups, elements));
29+
}
30+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /