352场周赛
6909. 最长奇偶子数组
给你一个下标从 0 开始的整数数组
nums和一个整数 threshold 。请你从
nums的子数组中找出以下标 l 开头、下标 r 结尾 (0 <= l <= r < nums.length) 且满足以下条件的 最长子数组 :
nums[l] % 2 == 0- 对于范围 [l, r - 1] 内的所有下标 i ,
nums[i] % 2 != nums[i + 1] % 2- 对于范围 [l, r] 内的所有下标 i
,nums[i] <= threshold- 以整数形式返回满足题目要求的最长子数组的长度
注意:子数组 是数组中的一个连续非空元素序列。
模拟即可
class Solution {
public:
int longestAlternatingSubarray(vector<int>& nums, int threshold) {
int ans = 0;
int n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] > threshold || (nums[i] % 2) != 0) {
continue;
}
int cnt = 1;
// cout << i << endl;
for (int j = i + 1; j < n; j++) {
if (nums[j] <= threshold && (nums[j] % 2) != nums[j - 1] % 2) {
cnt++;
} else {
break;
}
}
ans = max(ans, cnt);
}
return ans;
}
};
6916. 和等于目标值的质数对
给你一个整数 n 。如果两个整数 x 和 y 满足下述条件,则认为二者形成一个质数对:
1 <= x <= y <= nx + y == nx 和 y都是质数 请你以二维有序列表的形式返回符合题目要求的所有 [xi, yi] ,列表需要按 xi 的 非递减顺序 排序。如果不存在符合要求的质数对,则返回一个空数组。注意:质数是大于 1 的自然数,并且只有两个因子,即它本身和 1 。
欧式筛模板
const int N = 1e6 + 6;
//判断是否为质数
unordered_map<int, bool> mp;
class Solution {
public:
int d=0;
int p[N]={0};
int f[N]={1,1};
void func(int n) {
if (!mp.empty()) {
return;
}
for(int i=2;i<=n;i++){
if(f[i]==0){//如果没被标记过,那么i是质数
p[d++]=i;
}
for(int j=0;j<d;j++){
if(p[j]*i<=n){//标记以i为最大因数的数为不是素数(除了1和本身)
f[p[j]*i]=1;
}else{
break;
}
if(i%p[j]==0){//如果p[j]是i的因数,那么后面的数都不是以i为最大因数的
break;
}
}
}
for(int i = 0; i < d; i++) {
mp[p[i]] = true;
}
}
vector<vector<int>> findPrimePairs(int n) {
vector<vector<int>> ans;
func(N - 1);
for (int i = 1; i < n; i++) {
int left = i, right = n - i;
if (left > right) {
break;
}
if (mp[left] && mp[right]) {
ans.push_back({left, right});
}
}
return ans;
}
};
6911. 不间断子数组
给你一个下标从 0 开始的整数数组 nums 。nums 的一个子数组如果满足以下条件,那么它是 不间断 的:
i,i + 1 ,...,j 表示子数组中的下标。对于所有满足 i <= i1, i2 <= j 的下标对,都有
0 <= |nums[i1] - nums[i2]| <= 2。 请你返回 不间断 子数组的总数目。子数组是一个数组中一段连续 非空 的元素序列。
双指针、mutiset使用
class Solution {
public:
long long continuousSubarrays(vector<int> &nums) {
long long ans = 0;
// 允许键值重复,并排序左侧为最小值,右侧为最大值
multiset<int> s;
int left = 0, n = nums.size();
for (int right = 0; right < n; right++) {
s.insert(nums[right]);
while (*s.rbegin() - *s.begin() > 2)
// 当最大值最小值大于2时,移除最端点元素
s.erase(s.find(nums[left++]));
// 记录有效值为:right - left + 1
ans += right - left + 1;
}
return ans;
}
};
6894. 所有子数组中不平衡数字之和
一个长度为 n 下标从 0 开始的整数数组 arr 的 不平衡数字 定义为,在 sarr = sorted(arr) 数组中,满足以下条件的下标数目:
0 <= i < n - 1 ,和 sarr[i+1] - sarr[i] > 1 这里,sorted(arr) 表示将数组 arr 排序后得到的数组。
给你一个下标从 0 开始的整数数组 nums ,请你返回它所有 子数组 的 不平衡数字 之和。
子数组指的是一个数组中连续一段 非空 的元素序列。
暴力:
class Solution {
public:
int sumImbalanceNumbers(vector<int> &nums) {
int ans = 0, n = nums.size();
bool vis[n + 2];
for (int i = 0; i < n; i++) {
// 快速初始化为0
memset(vis, 0, sizeof(vis));
vis[nums[i]] = true;
int cnt = 0;
for (int j = i + 1; j < n; j++) {
int x = nums[j];
if (!vis[x]) {
cnt += 1 - vis[x - 1] - vis[x + 1];
vis[x] = true;
}
ans += cnt;
}
}
return ans;
}
};
部分代码来自LC题解区