leecode 第 62 场双周赛
第一题 5874. 分割数组的最多方案数
class Solution {
public:
vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
int len=original.size();
vector<vector<int>>res(m,vector<int>(n,0));
if(m*n!=len)
{
return {};
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
res[i][j]=original[n*i+j];
}
}
return res;
}
};
知识点
vector二维数组的定义。
vector<vector>res(m,vector(n,0))
使用:同数组方法。
第三题 5873. 考试的最大困扰度
class Solution {
public:
int maxConsecutiveAnswers(string answerKey, int k) {
int len=answerKey.size();
if(len==0) return 0;
int l=0,r=0;//滑动窗口[l,r]
int ans=1;//初始化最大长度为1,当前窗口内有一个元素
int tnum=0,fnum=0;
if(answerKey[l]=='T') tnum++;
else fnum++;
while(r<len)
{
if(tnum>k && fnum>k)//窗口内T/F数量超过可替换数量,则左窗口右移
{
if(answerKey[l]=='T') tnum--;
else fnum--;
l++;
}
else //否则,更新最大窗口值,右窗口向右扩大
{
ans=max(ans,(r-l+1));
r++;
if(answerKey[r]=='T') tnum++;
else fnum++;
}
}
return ans;
}
};
第四题 5874. 分割数组的最多方案数
知识点:前缀和+两个哈希表维护
typedef long long LL;
const int maxn=1e5+100;
class Solution {
LL sum[maxn];
unordered_map<LL,LL>mapR,mapL;
public:
int waysToPartition(vector<int>& num, int k) {
LL tot=0;LL ans=0;LL n=num.size();
for(int i=0;i<n;i++){
tot+=num[i];
if(i==0) sum[i]=num[i];
else sum[i]=sum[i-1]+num[i];
if( i+1<n ) mapR[tot]++;
}
///不修改
if(tot%2==0) ans=max(ans,mapR[tot/2]);
///修改
for(int i=0;i<n;i++){
LL d=k-num[i];
if( (tot+d)%2==0){
ans=max(ans,mapL[(tot+d)/2]+mapR[(tot-d)/2]);
}
mapL[sum[i]]++;
mapR[sum[i]]--;
}
return ans;
}
};