LeetCode352场周赛

113 阅读2分钟

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 <= n x + y == n x 和 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 ,请你返回它所有 子数组 的 不平衡数字 之和。

子数组指的是一个数组中连续一段 非空 的元素序列。

暴力:

image-20230702151712078

 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题解区