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 9690e3f

Browse files
committed
第159场双周赛T1~T4 & 第455场周赛T1~T4 (8)
1 parent d877391 commit 9690e3f

16 files changed

+1091
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
public class Solution3587 {
2+
public int minSwaps(int[] nums) {
3+
int[] cnt = new int[2];
4+
for (int v : nums) cnt[v % 2]++;
5+
6+
if (Math.abs(cnt[0] - cnt[1]) > 1) return -1;
7+
if (cnt[0] == cnt[1]) {
8+
return Math.min(getAns(nums, 0), getAns(nums, 1));
9+
} else if (cnt[0] > cnt[1]) { // 第一个偶数
10+
return getAns(nums, 0);
11+
} else {
12+
return getAns(nums, 1);
13+
}
14+
}
15+
16+
// st:0 偶数开头 st:1 奇数开头
17+
private int getAns(int[] nums, int st) {
18+
int ans = 0;
19+
for (int i = 0; i < nums.length; i++) {
20+
if (nums[i] % 2 == 0) {
21+
ans += Math.abs(i - st);
22+
st += 2;
23+
}
24+
}
25+
return ans;
26+
}
27+
}
28+
/*
29+
3587. 最小相邻交换至奇偶交替
30+
https://leetcode.cn/problems/minimum-adjacent-swaps-to-alternate-parity/description/
31+
32+
第 159 场双周赛 T1。
33+
34+
给你一个由互不相同的整数组成的数组 nums 。
35+
在一次操作中,你可以交换任意两个 相邻 元素。
36+
在一个排列中,当所有相邻元素的奇偶性交替出现,我们认为该排列是 有效排列。这意味着每对相邻元素中一个是偶数,一个是奇数。
37+
请返回将 nums 变成任意一种 有效排列 所需的最小相邻交换次数。
38+
如果无法重排 nums 来获得有效排列,则返回 -1。
39+
提示:
40+
1 <= nums.length <= 10^5
41+
1 <= nums[i] <= 10^9
42+
nums 中的所有元素都是 唯一 的
43+
44+
统计奇数和偶数的频次,再分类讨论。
45+
时间复杂度 O(n)。
46+
*/
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import java.util.HashMap;
2+
import java.util.Map;
3+
4+
public class Solution3588 {
5+
public long maxArea(int[][] coords) {
6+
return Math.max(getAns(coords, 0), getAns(coords, 1));
7+
}
8+
9+
// xy_type:0=x 1=y
10+
private long getAns(int[][] coords, int xy_type) {
11+
long minY = Integer.MAX_VALUE, maxY = Integer.MIN_VALUE;
12+
Map<Integer, Integer> minXForY = new HashMap<>();
13+
Map<Integer, Integer> maxXForY = new HashMap<>();
14+
for (int[] p : coords) {
15+
int x = p[xy_type], y = p[1 - xy_type];
16+
if (y < minY) minY = y;
17+
if (y > maxY) maxY = y;
18+
minXForY.merge(y, x, Math::min);
19+
maxXForY.merge(y, x, Math::max);
20+
}
21+
long ans = -1;
22+
// 处理平行于x轴的边的情况
23+
for (Map.Entry<Integer, Integer> entry : minXForY.entrySet()) {
24+
int y = entry.getKey();
25+
int minXInY = entry.getValue();
26+
int maxXInY = maxXForY.get(y);
27+
long base = maxXInY - minXInY;
28+
if (base <= 0) continue; // 底边长度无效
29+
long height = Math.max(y - minY, maxY - y);
30+
if (height <= 0) continue; // 高无效
31+
ans = Math.max(ans, base * height);
32+
}
33+
return ans;
34+
}
35+
}
36+
/*
37+
3588. 找到最大三角形面积
38+
https://leetcode.cn/problems/find-maximum-area-of-a-triangle/description/
39+
40+
第 159 场双周赛 T2。
41+
42+
给你一个二维数组 coords,大小为 n x 2,表示一个无限笛卡尔平面上 n 个点的坐标。
43+
找出一个 最大 三角形的 两倍 面积,其中三角形的三个顶点来自 coords 中的任意三个点,并且该三角形至少有一条边与 x 轴或 y 轴平行。严格地说,如果该三角形的最大面积为 A,则返回 2 * A。
44+
如果不存在这样的三角形,返回 -1。
45+
注意,三角形的面积 不能 为零。
46+
提示:
47+
1 <= n == coords.length <= 10^5
48+
1 <= coords[i][0], coords[i][1] <= 10^6
49+
所有 coords[i] 都是 唯一 的。
50+
51+
枚举平行于 x 轴情况:底边长度 为 maxXInY - minXInY,高度为 max(y - minY, maxY - y)。
52+
平行于 y 轴情况同理。
53+
时间复杂度 O(n)。
54+
*/
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import java.util.ArrayDeque;
2+
import java.util.Deque;
3+
4+
public class Solution3589 {
5+
static final int MAX_N = (int) 1e5;
6+
static boolean[] np;
7+
8+
static {
9+
np = new boolean[MAX_N + 1];
10+
np[1] = true;
11+
for (int i = 2; i * i <= MAX_N; i++) {
12+
if (!np[i]) {
13+
for (int j = i * i; j <= MAX_N; j += i) {
14+
np[j] = true;
15+
}
16+
}
17+
}
18+
}
19+
20+
public int primeSubarray(int[] nums, int k) {
21+
int n = nums.length, l = 0, r = 0, ans = 0;
22+
Deque<Integer> maxQ = new ArrayDeque<>(); // maxQ.getFirst() 为区间内最大值下标
23+
Deque<Integer> minQ = new ArrayDeque<>(); // minQ.getFirst() 为区间内最小值下标
24+
25+
// 上上个质数位置 last2
26+
int last = -1, last2 = -1;
27+
while (r < n) {
28+
if (!np[nums[r]]) {
29+
// 1、入
30+
last2 = last;
31+
last = r;
32+
33+
// 这里加不加 = 都可以
34+
while (!maxQ.isEmpty() && nums[r] > nums[maxQ.getLast()]) maxQ.removeLast();
35+
maxQ.addLast(r);
36+
while (!minQ.isEmpty() && nums[r] < nums[minQ.getLast()]) minQ.removeLast();
37+
minQ.addLast(r);
38+
39+
while (!maxQ.isEmpty() && !minQ.isEmpty()
40+
&& nums[maxQ.getFirst()] - nums[minQ.getFirst()] > k) {
41+
if (maxQ.getFirst() <= l) maxQ.removeFirst();
42+
if (minQ.getFirst() <= l) minQ.removeFirst();
43+
l++;
44+
}
45+
}
46+
// 3、更新答案。当右端点固定时,左端点合法范围 [l, last2]
47+
ans += last2 - l + 1;
48+
r++;
49+
}
50+
return ans;
51+
}
52+
}
53+
/*
54+
3589. 计数质数间隔平衡子数组
55+
https://leetcode.cn/problems/count-prime-gap-balanced-subarrays/description/
56+
57+
第 159 场双周赛 T3。
58+
59+
给定一个整数数组 nums 和一个整数 k。
60+
子数组 被称为 质数间隔平衡,如果:
61+
- 其包含 至少两个质数,并且
62+
- 该 子数组 中 最大 和 最小 质数的差小于或等于 k。
63+
返回 nums 中质数间隔平衡子数组的数量。
64+
注意:
65+
- 子数组 是数组中连续的 非空 元素序列。
66+
- 质数是大于 1 的自然数,它只有两个因数,即 1 和它本身。
67+
提示:
68+
1 <= nums.length <= 5 * 10^4
69+
1 <= nums[i] <= 5 * 10^4
70+
0 <= k <= 5 * 10^4
71+
72+
预处理质数 + 滑动窗口最大值最小值。
73+
时间复杂度 O(n)。
74+
相似题目: 1438. 绝对差不超过限制的最长连续子数组
75+
https://leetcode.cn/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/
76+
3578. 统计极差最大为 K 的分割方式数
77+
https://leetcode.cn/problems/count-partitions-with-max-min-difference-at-most-k/description/
78+
rating 2198 (clist.by)
79+
*/

0 commit comments

Comments
(0)

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