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 2a41ef1

Browse files
committed
会员题
1 parent 930012e commit 2a41ef1

File tree

8 files changed

+245
-0
lines changed

8 files changed

+245
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import java.util.Arrays;
2+
3+
public class Solution2113 {
4+
public int[] elementInNums(int[] nums, int[][] queries) {
5+
int n = nums.length;
6+
int q = queries.length;
7+
int[] ans = new int[q];
8+
Arrays.fill(ans, -1);
9+
for (int i = 0; i < q; i++) {
10+
int t = queries[i][0], idx = queries[i][1];
11+
t %= 2 * n;
12+
if (t < n && idx < n - t) {
13+
ans[i] = nums[t + idx];
14+
} else if (t > n && idx < t - n) {
15+
ans[i] = nums[idx];
16+
}
17+
}
18+
return ans;
19+
}
20+
}
21+
/*
22+
2113ドル. 查询删除和添加元素后的数组
23+
https://leetcode.cn/problems/elements-in-array-after-removing-and-replacing-elements/description/
24+
25+
给你一个 下标从 0 开始 的数组 nums。一开始,在第 0 分钟,数组没有变化。此后每过一分钟,数组的 最左边 的元素将被移除,直到数组为空。然后,每过一分钟,数组的 尾部 将添加一个元素,添加的顺序和删除的顺序相同,直到数组被复原。此后上述操作无限循环进行。
26+
- 举个例子,如果 nums = [0, 1, 2],那么数组将按如下流程变化:[0,1,2] → [1,2] → [2] → [] → [0] → [0,1] → [0,1,2] → [1,2] → [2] → [] → [0] → [0,1] → [0,1,2] → ...
27+
然后给你一个长度为 n 的二维数组 queries,其中 queries[j] = [timej, indexj],表示第 j 个查询。第 j 个查询的答案定义如下:
28+
- 如果在时刻 timej,indexj < nums.length,那么答案是此时的 nums[indexj];
29+
- 如果在时刻 timej,indexj >= nums.length,那么答案是 -1。
30+
请返回一个长度为 n 的整数数组 ans,其中 ans[j] 为第 j 个查询的答案。
31+
提示:
32+
1 <= nums.length <= 100
33+
0 <= nums[i] <= 100
34+
n == queries.length
35+
1 <= n <= 10^5
36+
queries[j].length == 2
37+
0 <= timej <= 10^5
38+
0 <= indexj < nums.length
39+
40+
41+
时间复杂度 O(q)。
42+
*/
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import java.util.ArrayDeque;
2+
import java.util.Arrays;
3+
import java.util.Queue;
4+
5+
public class Solution2123 {
6+
public int minimumOperations(int[][] grid) {
7+
int m = grid.length;
8+
int n = grid[0].length;
9+
int id = 1;
10+
for (int i = 0; i < m; i++) {
11+
for (int j = 0; j < n; j++) {
12+
if (grid[i][j] == 1) grid[i][j] = id++;
13+
}
14+
}
15+
16+
int S = id++;
17+
int T = id++;
18+
MaxFlow maxFlow = new MaxFlow(S, T);
19+
20+
for (int i = 0; i < m; i++) {
21+
for (int j = 0; j < n; j++) {
22+
if (grid[i][j] == 0) continue;
23+
int x = grid[i][j];
24+
if (i - 1 >= 0 && grid[i - 1][j] > 0) {
25+
int y = grid[i - 1][j];
26+
// 偶数到奇数连 1
27+
if ((i + j) % 2 == 0) maxFlow.add(x, y, 1);
28+
else maxFlow.add(y, x, 1);
29+
}
30+
if (j - 1 >= 0 && grid[i][j - 1] > 0) {
31+
int y = grid[i][j - 1];
32+
// 偶数到奇数连 1
33+
if ((i + j) % 2 == 0) maxFlow.add(x, y, 1);
34+
else maxFlow.add(y, x, 1);
35+
}
36+
if ((i + j) % 2 == 0) maxFlow.add(S, x, 1);
37+
else maxFlow.add(x, T, 1);
38+
}
39+
}
40+
return (int) maxFlow.maxflow();
41+
}
42+
43+
static class MaxFlow {
44+
int inf = 1 << 29, N = 100010, M = 600010;
45+
int[] head = new int[N], ver = new int[M], edge = new int[M], Next = new int[M], d = new int[N];
46+
int n, m, s, t, tot;
47+
long maxflow;
48+
Queue<Integer> q;
49+
50+
public MaxFlow(int s, int t) {
51+
this.s = s;
52+
this.t = t;
53+
this.tot = 1;
54+
}
55+
56+
void add(int x, int y, int z) {
57+
ver[++tot] = y;
58+
edge[tot] = z;
59+
Next[tot] = head[x];
60+
head[x] = tot;
61+
62+
ver[++tot] = x;
63+
edge[tot] = 0;
64+
Next[tot] = head[y];
65+
head[y] = tot;
66+
}
67+
68+
boolean bfs() { // 在残量网络上构造分层图
69+
Arrays.fill(d, 0);
70+
while (!q.isEmpty()) q.remove();
71+
q.add(s);
72+
d[s] = 1;
73+
while (!q.isEmpty()) {
74+
int x = q.remove();
75+
for (int i = head[x]; i != 0; i = Next[i]) {
76+
if (edge[i] != 0 && d[ver[i]] == 0) {
77+
q.add(ver[i]);
78+
d[ver[i]] = d[x] + 1;
79+
if (ver[i] == t) return true;
80+
}
81+
}
82+
}
83+
return false;
84+
}
85+
86+
int dinic(int x, int flow) { // 在当前分层图上增广
87+
if (x == t) return flow;
88+
int rest = flow, k;
89+
for (int i = head[x]; i != 0 && rest != 0; i = Next[i]) {
90+
if (edge[i] != 0 && d[ver[i]] == d[x] + 1) {
91+
k = dinic(ver[i], Math.min(rest, edge[i]));
92+
if (k == 0) d[ver[i]] = 0; // 剪枝,去掉增广完毕的点
93+
edge[i] -= k;
94+
edge[i ^ 1] += k;
95+
rest -= k;
96+
}
97+
}
98+
return flow - rest;
99+
}
100+
101+
long maxflow() {
102+
q = new ArrayDeque<>();
103+
long flow;
104+
while (bfs()) {
105+
while ((flow = dinic(s, inf)) != 0) maxflow += flow;
106+
}
107+
return maxflow;
108+
}
109+
}
110+
}
111+
/*
112+
2123ドル. 使矩阵中的 1 互不相邻的最小操作数
113+
https://leetcode.cn/problems/minimum-operations-to-remove-adjacent-ones-in-matrix/description/
114+
115+
给你一个 下标从 0 开始 的矩阵 grid。每次操作,你可以把 grid 中的 一个 1 变成 0 。
116+
如果一个矩阵中,没有 1 与其它的 1 四连通(也就是说所有 1 在上下左右四个方向上不能与其他 1 相邻),那么该矩阵就是 完全独立 的。
117+
请返回让 grid 成为 完全独立 的矩阵的 最小操作数。
118+
提示:
119+
m == grid.length
120+
n == grid[i].length
121+
1 <= m, n <= 300
122+
grid[i][j] 是 0 或者 1.
123+
124+
二分图最大匹配,由于 O(nm) 会 TLE。
125+
该用 Dinic 最大流来求。
126+
时间复杂度 O(sqrt(n) * m)。
127+
*/
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import org.junit.jupiter.api.Test;
2+
3+
public class Solution2113Tests {
4+
private final Solution2113 solution2113 = new Solution2113();
5+
6+
@Test
7+
public void example1() {
8+
9+
}
10+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import java.util.Arrays;
2+
3+
public class Solution2604 {
4+
private int[] hens, grains;
5+
private int n, m;
6+
7+
public int minimumTime(int[] hens, int[] grains) {
8+
Arrays.sort(hens);
9+
Arrays.sort(grains);
10+
this.hens = hens;
11+
this.grains = grains;
12+
n = hens.length;
13+
m = grains.length;
14+
15+
int left = 0;
16+
int right = hens[n - 1] + grains[m - 1];
17+
while (left < right) {
18+
int mid = left + (right - left) / 2;
19+
// 边界二分 F, F,..., F, [T, T,..., T]
20+
// ----------------------^
21+
if (checkMid(mid)) {
22+
right = mid;
23+
} else {
24+
left = mid + 1;
25+
}
26+
}
27+
return left;
28+
}
29+
30+
private boolean checkMid(int time) {
31+
int i = 0, j = 0;
32+
while (i < n && j < m) {
33+
int left = hens[i], right = hens[i];
34+
while (j < m) {
35+
left = Math.min(left, grains[j]);
36+
right = Math.max(right, grains[j]);
37+
if (Math.min(hens[i] - left, right - hens[i]) + right - left > time) break;
38+
j++;
39+
}
40+
i++;
41+
}
42+
return j == m;
43+
}
44+
}
45+
/*
46+
2604ドル. 吃掉所有谷子的最短时间
47+
https://leetcode.cn/problems/minimum-time-to-eat-all-grains/description/
48+
49+
一条线上有 n 只母鸡和 m 颗谷子。给定两个整数数组 hens 和 grains ,它们的大小分别为 n 和 m ,表示母鸡和谷子的初始位置。
50+
如果一只母鸡和一颗谷子在同一个位置,那么这只母鸡可以吃掉这颗谷子。吃掉一颗谷子的时间可以忽略不计。一只母鸡也可以吃掉多颗谷子。
51+
在 1 秒钟内,一只母鸡可以向左或向右移动 1 个单位。母鸡可以同时且独立地移动。
52+
如果母鸡行动得当,返回吃掉所有谷子的 最短 时间。
53+
提示:
54+
1 <= hens.length, grains.length <= 2*10^4
55+
0 <= hens[i], grains[j] <= 10^9
56+
57+
二分答案。
58+
*/
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
public class Solution2664 {
2+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
public class Solution2907 {
2+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
public class Solution2921 {
2+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
public class Solution3073 {
2+
}

0 commit comments

Comments
(0)

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