心情
题目在此
双周赛都补题
第一题(将一维数组转变成二维数组)
class Solution {
public:
vector<vector<int>> construct2DArray(vector<int>& o, int m, int n) {
int le = o.size();
if (m*n != le)return vector<vector<int>>{};;
vector<vector<int>> res(m,vector(n,0));
int k = 0;
for (int i = 0; i < m; i ++)
for (int j = 0; j < n; j ++)
res[i][j] = o[k++];
return res;
}
};
第二题(连接后等于目标字符串的字符串对)
中 等 ! = 中 等 中等!=中等 中等!=中等
class Solution {
public:
int numOfPairs(vector<string>& nums, string target) {
int num = 0,n = nums.size();
for (int i = 0; i < n; i ++)
for (int j = i + 1; j < n; j ++){
if(nums[i]+nums[j]==target)num++;
if(nums[j]+nums[i]==target)num++;
}
return num;
}
};
第三题(考试的最大困扰度)
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度。
类似题链接
二分加前缀和
class Solution {
public:
int maxConsecutiveAnswers(string ak, int k) {
int n = ak.size();
vector<int> sum0(n+1,0);
vector<int> sum1(n+1,0);
for (int i = 1; i <= n; i ++){
int t0,t1;
if (ak[i-1] == 'T')t0 = 0,t1 = 1;
else t0 = 1,t1 = 0;
sum0[i] = sum0[i-1] + t0;
sum1[i] = sum1[i-1] + t1;
}
int res = 0;
for (int r = 0; r < n; r ++){
int l0,l1;
l0 = lower_bound(sum0.begin(),sum0.end(),sum0[r + 1] - k) - sum0.begin();
l1 = lower_bound(sum1.begin(),sum1.end(),sum1[r + 1] - k) - sum1.begin();
res = max(res,r - l0 + 1);
res = max(res,r - l1 + 1);
}
return res;
}
};
第四题(分割数组的最多方案数)
待续