0%

第72场双周赛解答

第 72 场双周赛

链接↓

第 72 场双周赛

这场手速场,题目质量过低(…

5996.统计数组中相等且可以被整除的数对

给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k ,请你返回满足 0 <= i < j < nnums[i] == nums[j](i * j) 能被 k 整除的数对 (i, j)数目

示例 1:

1
2
3
4
5
6
7
8
输入:nums = [3,1,2,2,2,1,3], k = 2
输出:4
解释:
总共有 4 对数符合所有要求:
- nums[0] == nums[6] 且 0 * 6 == 0 ,能被 2 整除。
- nums[2] == nums[3] 且 2 * 3 == 6 ,能被 2 整除。
- nums[2] == nums[4] 且 2 * 4 == 8 ,能被 2 整除。
- nums[3] == nums[4] 且 3 * 4 == 12 ,能被 2 整除。

示例 2:

1
2
3
输入:nums = [1,2,3,4], k = 1
输出:0
解释:由于数组中没有重复数值,所以没有数对 (i,j) 符合所有要求。

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i], k <= 100

分析:

直接暴力,按题目意思

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int countPairs(vector<int>& nums, int k) {
int ans=0;
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
if(nums[i]==nums[j]){
if((i*j)%k==0){
ans++;
}
}
}
}
return ans;
}
};

5997.找到和为给定整数的三个连续整数

给你一个整数 num ,请你返回三个连续的整数,它们的 num 。如果 num 无法被表示成三个连续整数的和,请你返回一个 数组。

示例 1:

1
2
3
4
输入:num = 33
输出:[10,11,12]
解释:33 可以表示为 10 + 11 + 12 = 33 。
10, 11, 12 是 3 个连续整数,所以返回 [10, 11, 12]

示例 2:

1
2
3
输入:num = 4
输出:[]
解释:没有办法将 4 表示成 3 个连续整数的和。

提示:

  • 0 <= num <= 1015

分析:

按题目意思

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
vector<long long> sumOfThree(long long num) {
vector<long long> ans;
if(num%3==0){
ans.push_back(num/3-1);
ans.push_back(num/3);
ans.push_back(num/3+1);
}
return ans;
}
};

这也叫Medium难度?


5998.拆分成最多数目的偶整数之和

给你一个整数 finalSum 。请你将它拆分成若干个 互不相同 的偶整数之和,且拆分出来的偶整数数目 最多

  • 比方说,给你 finalSum = 12 ,那么这些拆分是 符合要求 的(互不相同的偶整数且和为 finalSum):(2 + 10)(2 + 4 + 6)(4 + 8) 。它们中,(2 + 4 + 6) 包含最多数目的整数。注意 finalSum 不能拆分成 (2 + 2 + 4 + 4) ,因为拆分出来的整数必须互不相同。

请你返回一个整数数组,表示将整数拆分成 最多 数目的偶整数数组。如果没有办法将 finalSum 进行拆分,请你返回一个 数组。你可以按 任意 顺序返回这些整数。

示例 1:

1
2
3
4
5
输入:finalSum = 12
输出:[2,4,6]
解释:以下是一些符合要求的拆分:(2 + 10),(2 + 4 + 6) 和 (4 + 8) 。
(2 + 4 + 6) 为最多数目的整数,数目为 3 ,所以我们返回 [2,4,6] 。
[2,6,4] ,[6,2,4] 等等也都是可行的解。

示例 2:

1
2
3
4
输入:finalSum = 7
输出:[]
解释:没有办法将 finalSum 进行拆分。
所以返回空数组。

示例 3:

1
2
3
4
5
输入:finalSum = 28
输出:[6,8,2,12]
解释:以下是一些符合要求的拆分:(2 + 26),(6 + 8 + 2 + 12) 和 (4 + 24) 。
(6 + 8 + 2 + 12) 有最多数目的整数,数目为 4 ,所以我们返回 [6,8,2,12] 。
[10,2,4,12] ,[6,2,4,16] 等等也都是可行的解。

提示:

  • 1 <= finalSum <= 1010

小彩蛋:

有意思的是我报错的时候,样例给出了2,然后我返回了[2,0],直接给我报错了。

在中文题目里第一行最后一句偶整数数目 最多

在英文描述里positive even integers.

真有他的.jpg


分析:

首先考虑是否能mod2

不能的话直接返回空数组

记录一个最小的 正偶数 ,用结果值去作差,每完成一次放入就到下一个正偶数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
vector<long long> maximumEvenSplit(long long f) {
vector<long long> ans;
int a=2;
if(f%2!=0){
return ans;
}
if(f==4){
ans.push_back(f);
return ans;
}
else{
while(f){
ans.push_back(a);
f-=a;
if(f==0){
break;
}
if((f/2)-2<=a){
ans.push_back(f);
break;
}
a+=2;
}
}
return ans;
}
};

5999.统计数组中好三元组数目

给你两个下标从 0 开始且长度为 n 的整数数组 nums1nums2 ,两者都是 [0, 1, ..., n - 1]排列

好三元组 指的是 3互不相同 的值,且它们在数组 nums1nums2 中出现顺序保持一致。换句话说,如果我们将 pos1v 记为值 vnums1 中出现的位置,pos2v 为值 vnums2 中的位置,那么一个好三元组定义为 0 <= x, y, z <= n - 1 ,且 pos1x < pos1y < pos1zpos2x < pos2y < pos2z 都成立的 (x, y, z)

请你返回好三元组的 总数目

示例 1:

1
2
3
4
5
输入:nums1 = [2,0,1,3], nums2 = [0,1,2,3]
输出:1
解释:
总共有 4 个三元组 (x,y,z) 满足 pos1x < pos1y < pos1z ,分别是 (2,0,1) ,(2,0,3) ,(2,1,3) 和 (0,1,3) 。
这些三元组中,只有 (0,1,3) 满足 pos2x < pos2y < pos2z 。所以只有 1 个好三元组。

示例 2:

1
2
3
输入:nums1 = [4,0,1,3,2], nums2 = [4,1,0,2,3]
输出:4
解释:总共有 4 个好三元组 (4,0,3) ,(4,0,2) ,(4,1,3) 和 (4,1,2) 。

提示:

  • n == nums1.length == nums2.length
  • 3 <= n <= 105
  • 0 <= nums1[i], nums2[i] <= n - 1
  • nums1nums2[0, 1, ..., n - 1] 的排列。

分析:

首先记录每一个nums2的位置

然后用值去替换nums1和nums2中数字

例如:

nums1第i个位置是v,那么我们把所有v都替换成i+1 (1~N)

借助树状数组统计

其次就是

找x

我们统计值小于nums2[i]且在第二个数组中出现在nums2[i]之前的数字有几个

//getSum(nums2[i]-1)个

找z

在找x的操作逆序遍历即可

//(nums1.size()-1-i-getSum(nums2[i]))个

最后进行一个求和即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#define LL long long
const int MAX=1e5+55;
int revp[MAX];
LL dans[MAX];
LL sum[MAX];

int lowbit(int x){
return x&(-x);
}
void addSum(int x){
for(int i=x;i<MAX;i+=lowbit(i)) sum[i]+=1;

}
int getSum(int x){
int ret=0;
for(int i=x;i;i-=lowbit(i)) ret+=sum[i];
return ret;
}

class Solution {
public:
long long goodTriplets(vector<int>& nums1, vector<int>& nums2) {
for(int i=0;i<nums1.size();i++) revp[nums2[i]]=i;
for(int i=0;i<nums1.size();i++){
int v=nums1[i];
nums2[revp[v]]=i+1;
}
for(int i=0;i<=nums1.size();i++){
sum[i]=0;
dans[i]=1;
}
for(int i=0;i<nums1.size();i++){
dans[i]=dans[i]*getSum(nums2[i]-1);
addSum(nums2[i]);
}
for(int i=0;i<=nums1.size();i++) sum[i]=0;
for(int i=nums1.size()-1;i>=0;i--){
dans[i]*=(nums1.size()-1-i-getSum(nums2[i]));
addSum(nums2[i]);
}

LL ans=0;
for(int i=0;i<nums1.size();i++) ans=ans+dans[i];
return ans;
}
};